3.前端项目搭建
3.1.开发环境检查
- 检查cnpm安装环境: 命令行下输入:cnpm -v
- 检查VueCli安装环境:命令行下输入:vue -V (注意:本工程使用VueCli4.0.0以上版本)
附录:
- 安装npm:直接安装node.js (输入 “npm -v” 测试是否安装成功; 输入 node –v 查看node版本)
- 安装cnpm:npm install -g cnpm —registry=https://registry.npm.taobao.org
- 全局安装vuecli:cnpm install -g @vue/cli (或:npm install -g @vue/cli@4.x.x)
- 查看当前安装的vue-cli版本:vue —version 或 vue –V
- 卸载旧版本的vue-cli:cnpm uninstall vue-cli -g
- 查看远程仓库中的版本号:cnpm view @vue/cli versions —json
3.2.搭建VueCli工程总体架构
3.2.1.搭建VueCli模板工程
- 命令行下进入工作空间目录中,输入: vue create elmclient (工程名必须小写)
- 选择预设模板:这里选择“Manually select features”(手动选择特征)
- 模块选取:Babel、Router
- 选择是否使用history 形式的路由:选择:Y
- 将依赖文件放在package.json中:选择:“in package.json”
- 是否将当前选择保存以备下次使用:选择:N
- 进入创建好的工程目录:cd elmclient
- 启动工程:npm run serve
在浏览器中测试:http://localhost:8080
3.2.2.添加其它依赖及配置文件
添加font-awesome与axios依赖:
cnpm install font-awesome –savecnpm install axios - -savecnpm install qs - -save
添加图片到src的assets中。
在src目录下添加common.js文件
//获取当前时间(XXXX-XX-XX)export function getCurDate() {var now = new Date();var year = now.getFullYear();var month = now.getMonth() + 1;var day = now.getDate();month = month < 10 ? "0" + month : month;day = day < 10 ? "0" + day : day;return year + "-" + month + "-" + day;}//向sessionStorage中存储一个JSON对象export function setSessionStorage(keyStr, value) {sessionStorage.setItem(keyStr, JSON.stringify(value));}//从sessionStorage中获取一个JSON对象(取不到时返回null)export function getSessionStorage(keyStr) {var str = sessionStorage.getItem(keyStr);if (str == '' || str == null || str == 'null' || str == undefined) {return null;} else {return JSON.parse(str);}}//从sessionStorage中移除一个JSON对象export function removeSessionStorage(keyStr) {sessionStorage.removeItem(keyStr);}//向localStorage中存储一个JSON对象export function setLocalStorage(keyStr, value) {localStorage.setItem(keyStr, JSON.stringify(value));}//从localStorage中获取一个JSON对象(取不到时返回null)export function getLocalStorage(keyStr) {var str = localStorage.getItem(keyStr);if (str == '' || str == null || str == 'null' || str == undefined) {return null;} else {return JSON.parse(str);}}//从localStorage中移除一个JSON对象export function removeLocalStorage(keyStr) {localStorage.removeItem(keyStr);}
在工程根目录下添加vue.config.js文件
module.exports = {devServer: {port: 8081}}
3.2.3.main.js文件
import Vue from 'vue'import App from './App.vue'import router from './router'import store from './store'import 'font-awesome/css/font-awesome.min.css'import axios from 'axios'import qs from 'qs'//导入自定义模块import {getCurDate,setSessionStorage,getSessionStorage,removeSessionStorage,setLocalStorage,getLocalStorage,removeLocalStorage} from './common.js'Vue.config.productionTip = false//设置axios的基础url部分axios.defaults.baseURL = 'http://localhost:8080/elm/';//将axios挂载到vue上,使用是就可以 this.$axios 这样使用了Vue.prototype.$axios = axios;Vue.prototype.$qs = qs;Vue.prototype.$getCurDate = getCurDate;Vue.prototype.$setSessionStorage = setSessionStorage;Vue.prototype.$getSessionStorage = getSessionStorage;Vue.prototype.$removeSessionStorage = removeSessionStorage;Vue.prototype.$setLocalStorage = setLocalStorage;Vue.prototype.$getLocalStorage = getLocalStorage;Vue.prototype.$removeLocalStorage = removeLocalStorage;router.beforeEach(function(to, from, next) {let user = sessionStorage.getItem('user');//除了登陆、注册、首页、商家列表、商家信息之外,都需要判断是否登陆了if (!(to.path == '/' || to.path == '/index' || to.path == '/businessList' || to.path == '/businessInfo' || to.path =='/login' || to.path == '/register')) {if (user == null) {router.push('/login');location.reload();}}next();});new Vue({router,store,render: h => h(App)}).$mount('#app')
3.2.4.App.vue文件
注意:在App.vue文件中,#app的高度也要设置为100%。
<template><div id="app"><router-view /></div></template><!-- 注意这里为共通样式,不能加scoped --><style>/*这里的内容,就是静态工程中的 reset.css*/html,body,div,span,h1,h2,h3,h4,h5,h6,ul,ol,li,p {margin: 0;padding: 0;font-family: "微软雅黑";}html,body,#app {/*必须要设置,这样总容器高度才能100%*/width: 100%;height: 100%;}ul,ol {list-style: none;}a {text-decoration: none;}</style>
3.2.5.路由index.js文件
import Vue from 'vue'import VueRouter from 'vue-router'import Index from '../views/Index.vue'import BusinessList from '../views/BusinessList.vue'// ... ...Vue.use(VueRouter)const routes = [{path: '/',name: 'Home',component: Index},{path: '/index',name: 'Index',component: Index},{path: '/businessList',name: 'BusinessList',component: BusinessList},{// ... ...}]//解决重复路由报异常问题const originalPush = VueRouter.prototype.pushVueRouter.prototype.push = function push(location) {return originalPush.call(this, location).catch(err => err)}const router = new VueRouter({mode: 'history',base: process.env.BASE_URL,routes})export default router
3.3.共通组件
3.3.1.Footer组件:
<template><!-- 底部菜单部分 --><ul class="footer"><li @click="toIndex"><i class="fa fa-home"></i><p>首页</p></li><li><i class="fa fa-compass"></i><p>发现</p></li><li @click="toOrderList"><i class="fa fa-file-text-o"></i><p>订单</p></li><li @click="toUserCenter"><i class="fa fa-user-o"></i><p>我的</p></li></ul></template><script>export default{name:'Footer',data(){return {user:{}}},methods:{toIndex(){this.$router.push('/index');},toOrderList(){this.user = this.$getSessionStorage('user');if(this.user==null){this.$router.push('/login');}else{this.$router.push('/orderList');}},toUserCenter(){this.user = this.$getSessionStorage('user');if(this.user==null){this.$router.push('/login');}else{this.$router.push('/userCenter');}}}}</script><style scoped>/****************** 底部菜单部分 ******************/.wrapper .footer{width: 100%;height: 14vw;border-top: solid 1px #DDD;background-color: #fff;position: fixed;left: 0;bottom: 0;display: flex;justify-content: space-around;align-items: center;}.wrapper .footer li{/*li本身的尺寸完全由内容撑起*/display: flex;flex-direction: column;justify-content: center;align-items: center;color: #999;user-select: none;cursor: pointer;}.wrapper .footer li p{font-size: 2.8vw;}.wrapper .footer li i{font-size: 5vw;}</style>
[
