vue新手第一次尝试将tp5和vue结合起来,特此记录以备自己回顾,供跟我一样在摸索中前行的程序猿们参考;如果有不合理的地方,欢迎大神们指正!
php中文网的“vue+tp分离开发实时疫情动态地图”视频教程https://www.php.cn/course/1172.html 对这次学习有很大的指导作用,下面的记录中也有用到教程中的课程源码
这个方法通过外部API接口获取国外疫情数据,筛选出有用的部分,返回json格式的数据
public function index(){//通过外部接口获取国外疫情数据$ex_res1 = file_get_contents("http://api.tianapi.com/txapi/ncovabroad/index?key=6c6d319a9f3b53c53b375c56fbd39207");$ex_res = json_decode($ex_res1, true);$list = $ex_res['newslist'];$newList = [];if ($list != null) {foreach ($list as $k => $v) {$newList[$k]['name'] = $v['provinceName'];//国家名字$newList[$k]['currentConfirmedCount'] = $v['currentConfirmedCount'];//当前确诊人数$newList[$k]['confirmedCount'] = $v['confirmedCount'];//累计确诊人数$newList[$k]['deadCount'] = $v['deadCount'];//死亡人数$newList[$k]['curedCount'] = $v['curedCount'];//治愈人数}}//返回json数据return json($newList);}
//后端跨域路由配置Route::get('mytestt/index','six_products/mytestt/index')->allowCrossDomain();
在前端的main.js文件中添加以下代码
import axios from 'axios'// 注册axios变量Vue.prototype.$axios = axios// 注册后端域名变量Vue.prototype.$host = 'https://test.cn/public/'
其中https://test.cn/public是后端的域名
created () {this.$axios.get(this.$host + 'mytestt/index').then(res => {const data = res.datathis.curedCount = data[0].curedCountthis.deadCount = data[0].deadCountthis.currentConfirmedCount = data[0].currentConfirmedCountthis.confirmedCount = data[0].confirmedCountthis.update_time = data.update_timethis.country = data[0].name}).catch(res => {console.log(res)})},
上面代码中$axios.get()中的’mytestt/index’就是第二步设置的后端跨域路由地址,两个一定要正确对应起来
在前端项目的terminal窗口执行cnpm run build命令,打包完成后会在项目根目录下生成一个dist文件夹,包含static文件下和index.html文件,
(我放到了控制器的index方法中,据说也可以直接放到public目录下,具体参考:https://blog.csdn.net/qq236710052/article/details/107592387)
<?phpnamespace app\six_products\controller;use think\Controller;class Mytestu extends Controller{public function index(){return $this->view->fetch();}}
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>my-project</title><link href=/public/static/mytestu/css/app.9d739eebe64572b1f681feaa09be9e07.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/public/static/mytestu/js/manifest.2ae2e69a05c33dfc65f8.js></script><script type=text/javascript src=/public/static/mytestu/js/vendor.717a4ce3893d952882a7.js></script><script type=text/javascript src=/public/static/mytestu/js/app.5230369e4a91166d76b4.js></script></body></html>
这样就完成了整个项目的搭建,在浏览器中输入
https://test.cn/public/six_products/mytestu/index访问的结果如下图
在此附上前端完整的App.vue文件代码:
<template><div id="app"><h3>{{country}}疫情</h3><p class="txt">来源:各地官方通报及权威媒体报道</p><p class="txt">更新:{{update_time}}</p><div class="flexbox"><div class="item"><div class="red bold">{{confirmedCount}}</div><div class="gray tittle">累计确诊</div></div><div class="item"><div class="red bold">{{currentConfirmedCount}}</div><div class="gray tittle">现确诊</div></div><div class="item"><div class="gray bold">{{deadCount}}</div><div class="gray tittle">死亡</div></div><div class="item"><div class="green bold">{{curedCount}}</div><div class="gray tittle">治愈</div></div></div></div></template><script>export default {name: 'App',data () {return {country: '美国',update_time: '',confirmedCount: 0,currentConfirmedCount: 0,deadCount: 0,curedCount: 0}},created () {this.$axios.get(this.$host + 'mytestt/index').then(res => {const data = res.datathis.curedCount = data[0].curedCountthis.deadCount = data[0].deadCountthis.currentConfirmedCount = data[0].currentConfirmedCountthis.confirmedCount = data[0].confirmedCountthis.update_time = data.update_timethis.country = data[0].name}).catch(res => {console.log(res)})},methods: {}}</script><style>#app {font-family: 'Avenir', Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;}</style><style scoped>.txt {font-size: 14px;color: grey;}.flexbox {margin-bottom: 10px;width: 100%;height: 80px;background-color: lightgray;border-radius: 5px;display: flex;justify-content: center;align-items: center;}.item {flex-direction: column;display: flex;width: 80px;height: 80px;margin: 0 50px;/* border:1px solid red; */justify-content: center;align-items: center;}.red {color: #cc0000}.green {color: #42B983;}.gray {color: gray}.tittle {font-size: 14px;}.bold {font-weight: 600;font-size: 18px;}</style>
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号