Yii框架和Vue的完美结合完成前后端分离项目
背景说明
本文假设你对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> <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接收三个入参
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显示
总结一下规范
vue项目和yii项目的命名必须一致
vue的build项目必须放在yii的web下的新建文件下,文件夹名称必须和项目名称相同
yii项目控制器里建立Webapp的action作为客户端访问H5页面的唯一入口
vue的路由需要按照模块名称建立路由文件
结束语
后端代码核心就是actionWebapp,
前端代码给大家参考一下:https://github.com/ahuchjm/Vue_Bapp.git
祝生活愉快!!!
Yii框架和Vue的完美结合完成前后端分离项目的更多相关文章
- ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目
一.前言 这几年前端的发展速度就像坐上了火箭,各种的框架一个接一个的出现,需要学习的东西越来越多,分工也越来越细,作为一个 .NET Web 程序猿,多了解了解行业的发展,让自己扩展出新的技能树,对自 ...
- 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& ...
- 基于Vue的前后端分离项目实践
一.为什么需要前后端分离 1.1什么是前后端分离 前后端分离这个词刚在毕业(15年)那会就听说过,但是直到17年前都没有接触过前后端分离的项目.怎么理解前后端分离?直观的感觉就是前后端分开去做,即功 ...
- nginx+vue+uwsgi+django的前后端分离项目部署
Vue+Django前后端分离项目部署,nginx默认端口80,数据提交监听端口9000,反向代理(uwsgi配置)端口9999 1.下载项目文件(统一在/opt/luffyproject目录) (1 ...
- 喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了
折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...
- docker-compose 部署 Vue+SpringBoot 前后端分离项目
一.前言 本文将通过docker-compose来部署前端Vue项目到Nginx中,和运行后端SpringBoot项目 服务器基本环境: CentOS7.3 Dokcer MySQL 二.docker ...
- 两个开源的 Spring Boot + Vue 前后端分离项目
折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...
- Springboot+vue前后端分离项目,poi导出excel提供用户下载的解决方案
因为我们做的是前后端分离项目 无法采用response.write直接将文件流写出 我们采用阿里云oss 进行保存 再返回的结果对象里面保存我们的文件地址 废话不多说,上代码 Springboot 第 ...
- Win10环境前后端分离项目基于Vue.js+Django+Python3实现微信(wechat)扫码支付流程(2021年最新攻略)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_182 之前的一篇文章:mpvue1.0+python3.7+Django2.0.4实现微信小程序的支付功能,主要介绍了微信小程序内 ...
随机推荐
- 1714 B君的游戏(Nim博弈)
1714 B君的游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 B君和L君要玩一个游戏.刚开始有n个正整数 ai . 双方轮流操作.每次操作,选一个正整数 ...
- The E-pang Palace(暴力几何)
//暴力的几何题,问,n个点可以组成的矩形,不相交,可包含的情况下,最大的面积,还有就是边一定与 x y 轴平行,所以比较简单了 //暴力遍历对角线,搜出所有可能的矩形,然后二重循环所有矩形,判断一下 ...
- 图片上传JS插件梳理与学习
项目的oper端和seller端,用了两个不同插件,简单了解一下: 一.seller端:AjaxUpload.js seller端使用的是 AjaxUpload.js ,封装好的一个库.调用时传入参数 ...
- C#设计模式-单实例
单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点. 1.经典的模式 namespace singleClass { class ...
- asp.net mvc4连接mysql
环境:vs2013+mysql5.6+mysql connector for .net 6.8.3+MySQL for Visual Studio 1.1.3 参考:http://dev.mysql. ...
- tomcat部署jenkins启动报错:insufficient free space available after evicting expired cache entries-consider increasing the maximum size of the cache.
在tomcat里面部署jenkins,启动tomcat,在jenkins上操作不久之后,jenkins就挂掉了,查看tomcat控制台,报内存溢出信息: 解决该问题方法,修改tomcat/bin目录下 ...
- typeof的使用技巧
typeof 对于基本类型,除了 null 都可以显示正确的类型 <template> <section class="p-10"> <el-b ...
- 如何修改本地hosts文件?
1.window7修改本地hosts文件 # window7系统hosts文件位置 C:\Windows\System32\drivers\etc 2.linux # linux系统hosts文件位置 ...
- 【Java工程师之路】[1-2.2]Java10个面向对象设计原则
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
- ZRGGBS00 GGB1替代问题
ZRGGBS00ZRGGBS00ZRGGBS00 和Validation不同的是,Validation只做检测,一般不做相应数据的修改,Substitution弥补了这反面的缺陷,它和user exi ...