背景说明

本文假设你对Yii和Vue都比较熟悉,至少都在项目里用过,另外笔者新人,以后不定时放一些干货,欢迎程序媛关注

Yii是一个PHP全端框架,典型的mvc的项目结构,后端接口都是一个控制器里放了很多的action,每个action都是一个接口,可以返回JSON,也可以render出一个html5页面,这些页面就是mvc的view,结构紧凑强耦合。

Vue是一个前端框架,主要思想就是SPA(单页面应用),组件化开发是其根本目的。

这两者怎么去结合使用才能达到工程的最易开发和最易维护是一个很值得思考的问题,小编结合项目需求,设计了一套利用这两者来构建前后端分离项目的架构

Yii项目结构

看一下项目目录的样子

这里有bapp、bmanager、bshare等等多个项目,每个项目里的文件结构是这样的

Vue项目结构

前后端分离思路

既然我们已经考虑前后端分离了,那么Yii里面的view层,我们就不需要了,类似于这些view的代码

return $this->render('baseinfo', ['phone' => $contact['mobilephone'], 'isdel' => $isdel]);
var host = "<?= Yii::$app->params['bUrl']?>";var mobilephone="<?php echo $phone ?>";var isdel="<?php echo $isdel ?>";
<div class="base"><span class="name"><?php echo $name; ?></span>&ensp;<span class="mobile"><?php echo $mobilephone; ?></span></div><div class="mark">备注:<?php echo $notes; ?></div>

这些看上去非常丑陋的代码将不允许出现在项目里。Vue是一个完整的前端SPA项目,放在服务器上可以独立运行。那么我们考虑把这个项目打包放在bapp的web目录下(下面以bapp项目为案例说明),因为这个web目录就是Yii里边对应站点的根目录,(例如bapp项目的域名为bapp.stock.com,在web目录下放一张图片,那么这张图片的远程路径就该是http://bapp.stock.com/IMG_1383.JPG)

这里有一个关键的地方,我们整个项目叫做bapp,那么Yii里面的后端项目取名就叫做bapp,vue前端项目取名也叫bapp,这样能保持对应,便于理解,这是一个要遵守的规范。

这个是vue成功build之后的文件,存放在web/bapp下,对于一个vue-cli初始化构造的项目,现在就可以使用url:http://bapp.stock.com/bapp来访问你的前端项目了

vue-yii架构完整实现

上面的思路基本就实现了一个简单的前后端分离过程。实际项目中我们还有很多需要规范和注意的地方。下面依据我们需要解决的三个主要问题来进一步设计这个架构

  • vue的build项目自动放在yii的web目录下

这一点对于这种前后端分离的开发模式很重要,vue-cli默认的build路径是放在dist下,现在必须要让build的文件自动放在其他路径下的yii的web下,这里就需要修改默认的配置了

由于vue项目默认是存放在站点的根目录下,也就是编译后生成的所有文件必须放在trunk/bapp/web下,这个目录原本有一些其他文件,最好不要直接扔过去,建一个新目录trunk/bapp/web/bapp来存放这些文件将会更加清晰。这样你会发现一个新问题,你build的项目放在web/bapp下会无法运行,会找不到文件路径。这就要修改vue的运行根目录,用来解决vue项目在子站点里无法运行的问题,很简单,修改路由的base即可

  • 开发环境生产环境部署怎么解决

Vue项目的config下有dev.env.js、test.env.js、prod.env.js,你可以在这里设置你的APIURL,请求接口的地方使用process.env.APIURL来获取,这种模式下,我们需要在不同环境发布不同的webapp包,类似于Android和ios的app开发模式。这种方法在我们这并不可取,因为PHP在各个环境里已经配置了站点,vue项目在php项目下,所以我们要从php来获取当前的运行环境,这才显示出我们这种架构的易维护呀。具体思路就是在vue里解析当前的url获取环境了。

在vue的main.js里来做这个工作

利用document.location.href获取运行环境,把api站点存在vuex里,需要请求接口的地方从vuex里直接取,上面代码里解析完apiurl之后有一个解析路由的过程,这个下面再讲

  • 原生客户端怎么去请求vue页面

vue项目可能会包含很多页面,有的页面可能是一个较大的模块,比如商城系统的所有页面,有的页面可能就是一个用户须知什么的单页面,客户端浏览器在调用这些页面需要按照模块来调用。这里就要求vue项目在开发过程中必须按照不同模块在route下建立不同路由的规范去做,这样既有利于前端代码碎片化,也有利于客户端调用更加方便。

在后端控制器里trunk/bapp/controllers/里我有一个BuserController的控制器,在这个控制器里添加了一个action

这个action非常重要,是前后端分离的关键

这个action非常重要,是前后端分离的关键

这个action非常重要,是前后端分离的关键

这个action名字也需要遵循规范都叫做webapp,在后端其他项目里,比如我的工程里还有capp项目,我也可以在capp下的CuserController里添加这个webapp的action。

$url = Yii::$app->params['bUrl'] . "bapp/#/{$page}?route={$route}&{$query}&" . $this->sessionQueryString();

其中这行代码比较关键,这个url其实就是bapp/web/bapp的vue项目的地址,

Yii::$app->params['bUrl']

是配置在PHP里的域名地址

bapp/#/{$page}

是vue的hash路由的调用方式,具体可参看vue官方文档

$this->sessionQueryString();

是取的sessionid,这个读者可以改成自己系统里的登录标记

客户端显示的所有h5都通过这个接口获取,对这个接口的参数有必要重点说明,webapp接收三个入参

  1. route(必传)

route参数由前端定义,比如前端有一个商城的模块叫做mall,那么vue的router下应该会有一个mall.js,里面管理所有商城的页面分发,客户端想显示mall的页面就在调用webapp时用route=mall,再比如前端有一个活动页面的模块activity,那么vue的router下会有一个activity.js来管理所有活动页面的分发,客户端要显示活动页面必须传route=activity

2.page(非必传)

对于像mall这样的完整模块,客户端可能只需要显示mall的首页就可以了,那么page就不需要传,自动进入到vue的router/mall.js的默认页面,如果像活动模块,这里面的页面可能都不关联,可能有activity1、activity2、acitivity3等页面,客户端想显示activity2页面,就必须传page=activity2

3.addition(非必传)

用addition传的是附加参数,客户端在调用某个页面时,可能会带上一些用户信息,比如手机号,token,session等,这些参数都放在addition中

原生客户端通过get或post都可以调用这个接口取到页面,简单说下两种调用方式区别

GET:这里需要注意addition这个附加参数怎么拼到url里,例如有这种json

{

"mobile":"18512331232",

"info":{

"name":"jimmy",

"sex":"mail"

}

}

二维数组的get传参很多同学都不知道,注意一下

http://xxx.xxx?addition[mobile]=18512331232&addition[info][name]=jimmy&addition[info][sex]=mail

这个地址在原生的webview里直接loadUrl即可

POST:所有参数都放在post体里边,接口返回的是最终需要显示的h5页面的代码,原生在取到这个h5代码之后

webview需要loadHtml显示

总结一下规范

  1. vue项目和yii项目的命名必须一致

  2. vue的build项目必须放在yii的web下的新建文件下,文件夹名称必须和项目名称相同

  3. yii项目控制器里建立Webapp的action作为客户端访问H5页面的唯一入口

  4. vue的路由需要按照模块名称建立路由文件

结束语

后端代码核心就是actionWebapp,

前端代码给大家参考一下:https://github.com/ahuchjm/Vue_Bapp.git

祝生活愉快!!!

Yii框架和Vue的完美结合完成前后端分离项目的更多相关文章

  1. ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目

    一.前言 这几年前端的发展速度就像坐上了火箭,各种的框架一个接一个的出现,需要学习的东西越来越多,分工也越来越细,作为一个 .NET Web 程序猿,多了解了解行业的发展,让自己扩展出新的技能树,对自 ...

  2. List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac

    List多个字段标识过滤 class Program{  public static void Main(string[] args) { List<T> list = new List& ...

  3. 基于Vue的前后端分离项目实践

    一.为什么需要前后端分离 1.1什么是前后端分离  前后端分离这个词刚在毕业(15年)那会就听说过,但是直到17年前都没有接触过前后端分离的项目.怎么理解前后端分离?直观的感觉就是前后端分开去做,即功 ...

  4. nginx+vue+uwsgi+django的前后端分离项目部署

    Vue+Django前后端分离项目部署,nginx默认端口80,数据提交监听端口9000,反向代理(uwsgi配置)端口9999 1.下载项目文件(统一在/opt/luffyproject目录) (1 ...

  5. 喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  6. docker-compose 部署 Vue+SpringBoot 前后端分离项目

    一.前言 本文将通过docker-compose来部署前端Vue项目到Nginx中,和运行后端SpringBoot项目 服务器基本环境: CentOS7.3 Dokcer MySQL 二.docker ...

  7. 两个开源的 Spring Boot + Vue 前后端分离项目

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  8. Springboot+vue前后端分离项目,poi导出excel提供用户下载的解决方案

    因为我们做的是前后端分离项目 无法采用response.write直接将文件流写出 我们采用阿里云oss 进行保存 再返回的结果对象里面保存我们的文件地址 废话不多说,上代码 Springboot 第 ...

  9. Win10环境前后端分离项目基于Vue.js+Django+Python3实现微信(wechat)扫码支付流程(2021年最新攻略)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_182 之前的一篇文章:mpvue1.0+python3.7+Django2.0.4实现微信小程序的支付功能,主要介绍了微信小程序内 ...

随机推荐

  1. bloom filter + murmurhash

    是一种hash方法,其实核心思想就是,将一个字符串通过多个普通hash函数映射到hash表上,然后再进行检索的时候同样计算hash函数,如果全都都hash表上出现过,那么说明有极大的可能出现过,如果没 ...

  2. PhotoSwipe异步动态加载图片

    在开发搜房家居M站的时候,搜房家居装修效果图相册展示效果需要用到PhotoSwipe插件来显示图片.特点:1. 家居提供的接口,每次只能获取一张图片2. 装修效果图的张数不限.3. 从PhotoSwi ...

  3. oracle 查看表是否被锁

    --以下几个为相关表SELECT * FROM v$lock;SELECT * FROM v$sqlarea;SELECT * FROM v$session;SELECT * FROM v$proce ...

  4. border inset outset ,border-radius

    1. 例子: div{ width:256px; height:256px; border: 10px inset #f00; margin:0 auto; border-radius:255px; ...

  5. 第六课作业——主从复制和sentinel高可用

    第六课时作业 静哥 by 2016.3.21~2016.4.3   [作业描述] 1.配置主从复制,截图看日志 2.配置一个哨兵,一主一从结构,并实现主宕机从接管的过程,截图显示 3.总结哨兵的原理 ...

  6. hadoop报错java.io.IOException: Bad connect ack with firstBadLink as 192.168.1.218:50010

    [root@linuxmain hadoop]# bin/hadoop jar hdfs3.jar com.dragon.test.CopyToHDFS Java HotSpot(TM) Client ...

  7. standard pbr(二)

    下一步看像素着色器代码 half4 fragBase (VertexOutputForwardBase i) : SV_Target { return fragForwardBaseInternal( ...

  8. PAT 1072. 开学寄语(20) JAVA

    下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其QQ,封其电脑,夺其手机,收其ipad,断其wifi,使其百无聊赖,然后,净面.理发.整衣,然后思过.读书.锻炼.明智.开悟.精进 ...

  9. jQuery 查找标签

    1 基本选择器 2 基本筛选器 3 属性选择器 4 间接选择 1 基本选择器 //id选择器: $("#id") //标签选择器: $("tagName") / ...

  10. EXCEL 从网页复制的内容 单/多选框 在EXCEL删不掉 及 2007添加开发工具选项卡

    从网页复制到Excel中的单选.多选框等,有时候删除时怎么都删不掉,很是恶心.这时候需要使用“开发工具”来删除.它是设计模式下的一种组件或者说控件. Excel 2007 的可以用下图方式按delet ...