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实现微信小程序的支付功能,主要介绍了微信小程序内 ...
随机推荐
- [Spring Data MongoDB]学习笔记--建立数据库的连接
1. 有了上一篇的Mongo后,连接数据库我们还需要更多的信息,比如数据库名字,用户名和密码等. 我们可以继续来配置MongoDbFactory的实例. public interface MongoD ...
- web容器 web服务器 servlet/jsp容器 之间的区别和关系是什么?
web容器 web服务器 servlet/jsp容器 之间的区别和关系是什么? 这是我在网上找的一些资料:1. Web浏览器除了可以在本地硬盘上打开网页文档外,还可以使用http网络协议从网络上的We ...
- 【BZOJ1923】[Sdoi2010]外星千足虫 高斯消元
[BZOJ1923][Sdoi2010]外星千足虫 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 ...
- SharePoint 2013 安装.net framework 4.5已经存在更高版本的解决方案
请参考: https://support.microsoft.com/en-us/help/3087184/sharepoint-2013-or-project-server-2013-setup-e ...
- Spring3.2.11与Quartz2.2.1整合时内存泄漏的问题的解决
Quartz是一款定时任务调度的开源框架,使用起来比较方便.并且Spring的support包对Quartz有集成.但是笔者在web应用使用的过程中却遇到了内存泄漏的问题. 问题的产生 笔者在使用Sp ...
- KVC && KVO 初见
Look,这是一个很简单的要求,点击Add me,age +1. 想一想的话很简单的,设置一个属性Nsinteger age,点击button add me,直接加1在重新显示Lable就好啦,不过, ...
- SQL查询父节点下的所有子节点(包括子节点下的子节点,无限子节点)
-->Title:Generating test data -->Author:wufeng4552 -->Date :2009-09-30 08:52:38 set nocount ...
- 【转】jstack简单使用
转载记录下, 转载自https://www.cnblogs.com/chenpi/p/5377445.html 当我们运行java程序时,发现程序不动,但又不知道是哪里出问题时,可以使用JDK自带的j ...
- 使用jquery的ajax方法获取下拉列表值
AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新,用户体验非常好. ...
- 洛谷 P1407 [国家集训队]稳定婚姻
洛谷 这个题面很有意思,像我这样的菜鸡,完全不需考虑婚姻的稳定 性 问题. tarjan裸题,直接讲算法吧: 原配夫妻之间分别连一条边,小情人之间反向连边. 这时候我们会发现一个性质,如果婚姻稳定,那 ...