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实现微信小程序的支付功能,主要介绍了微信小程序内 ...
随机推荐
- Nginx 启动、停止、平滑重启和平滑升级 graceful shutdown of worker processes
Controlling nginx http://nginx.org/en/docs/control.html nginx can be controlled with signals. The pr ...
- nosql_action
ps -aux 查当前端口占用 connecting to: test > show dbs local .078125GB testphp .203125GB > use testph ...
- <2013 07 22> 游历西欧
从本月11号开始到昨天,10天时间,和其他六位同学畅游了西欧,路经慕尼黑-巴塞罗马-尼斯-马赛-巴黎-阿姆斯特丹,最后回到慕尼黑,每个地方都待了两天,参观了主要的景点和建筑,见识了本地文化与饮食. 令 ...
- jQuery-PHP跨域请求数据
jQuery: //获取域名 function getDomain(url){ var a = document.createElement('a'); a.href = url; url=a.hos ...
- php扩展redis链接失败,返回false
刚开始接触redis,发现一直返回false,其实只要关闭防火墙就可以连接成功了. 关闭selinux操作 方法1:修改grub.conf将参数selinux=1修改为等于selinux=0,这个 ...
- 从B 树、B+ 树、B* 树谈到R 树(转)
作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由weedge完成,R 树部分由Fra ...
- PhpStorm2017.1版激活方法、汉化方法以及界面配置
本教程仅对2017.1版有效!!!!!! PhpStorm激活和汉化文件下载网址(提取密码:62cg) PhpStorm的介绍 PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提高用户效率, ...
- SAP后勤模块实施攻略——1.ERP和SAP
近日接到任务,看完乐立骏老师的SAP后勤模块实施攻略这本书,现在把第一章内容简单整理.第一章讲的是关于ERP和SAP的介绍. 1.ERP E:Enterprise / 企业 R:Resource / ...
- 《Deep learning》第四章——数值计算
数值计算 机器学习算法通常需要大量的数值计算.这通常是指通过迭代过程更新解的估计值来解决数学问题的算法,而不是通过解析过程推导出公式来提供正确解的方法.常见的操作包括优化(找到最小化或最大化函数值的参 ...
- windows中使用Findwindow函数与FindWindowEx函数来实现自动控制、触发第三方软件事件的方法
FindWindow 用来根据类名和窗口名来得到窗口句柄的.但是这个函数不能查找子窗口,也不区分大小写. 如果要从一个窗口的子窗口中查找需要使用FindWindowEX. 如果要搜索的外部程序的窗口标 ...