一个关于vue+mysql+express的全栈项目(二)------ 前端构建

一、使用vue-cli脚手架构建

 1 <!-- 全局安装vue-cli -->
 2 npm install -g vue-cli
 3 <!-- 设置vue webpack模板 -->
 4 vue init webpack my-project
 5 <!-- 进入项目 -->
 6 cd my-project
 7 <!-- 安装依赖 -->
 8 npm install
 9 <!-- 启动项目 -->
10 npm run dev

二、安装axios并统一处理请求接口(二次封装axios)

1.安装

npm install axios --save

2.获取当前域名

 1 export default function getBaseUrl (type) {
 2   let [baseUrl, protocol] = [‘https://xxxxxxx‘, ‘http://‘]
 3   // 判断协议
 4   if (location.protocol === ‘https:‘) {
 5     protocol = ‘https://‘
 6   }
 7   if (location.hostname !== ‘localhost‘) {
 8     baseUrl = protocol + location.hostname
 9   }
10   return baseUrl
11 }

3.封装axios

import axios from ‘axios‘
import qs from ‘qs‘
import getUrl from ‘./baseUrl‘
import i18n from ‘../../language‘
// 配置axios的config
const language = ‘mx‘
let config = {
  // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
  // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  baseURL: getUrl(),
  // `withCredentials` 表示跨域请求时是否需要使用凭证(登陆的时候会有cookie这个时候要用到)
  withCredentials: true,
  headers: {
    // 设置
    ‘Content-Type‘: ‘application/x-www-form-urlencoded‘
  },
  transformRequest: [function (data) {
    // 处理发送前的数据
    data = qs.stringify(data)
    return data
  }],
  data: {
    // 全局参数
    channelType: ‘6‘,
    channelTag: ‘6_7_0_0‘,
    language: language
  }
}
// 拦截请求
axios.interceptors.request.use((config) => {
  // console.log(‘请求前‘)
  if (channelType) {
    config.data.channelType = channelType
  }
  if (channelTag) {
    config.data.channelTag = channelTag
  }
  return config
}, error => {
  return Promise.reject(error)
})
// axios拦截响应
axios.interceptors.response.use((data) => {
  let resdata = data
  if (data.data.errCode === 3 && data.data.retCode === 3) {
  }
  return data
}, error => {
  return Promise.reject(error)
})

const get = (url, params) => {
  url = urlEncode(url, params)
  return axios.get(url, config)
}

const post = (url, params, con) => {
  return axios.post(url, params, config)
}

// 用来拼接get请求的时候的参数
let urlEncode = (url, data) => {
  if (typeof (url) === ‘undefined‘ || url === null || url === ‘‘) return ‘‘
  if (typeof (data) === ‘undefined‘ || data === null || typeof (data) !== ‘object‘) return url
  url += (url.indexOf(‘?‘) !== -1) ? ‘‘ : ‘?‘
  for (let k in data) {
    url += ((url.indexOf(‘=‘) !== -1) ? ‘&‘ : ‘‘) + k + ‘=‘ + encodeURI(data[k])
  }
  return url
}

export {
  get,
  post
}

4.在src目录下新建api文件夹(该文件夹下我们放置我们所有的请求接口)如下图

三、引入vuex进行状态管理

在src目录下新建store文件夹,然后依次新建actions.js/getters.js/index.js/mutation-types.js/mutation.js/state.js

index.js

import Vue from ‘vue‘
import Vuex from ‘vuex‘

import * as actions from ‘./actions‘
import * as getters from ‘./getters‘
import state from ‘./state‘
import mutations from ‘./mutations‘
import createLogger from ‘vuex/dist/logger‘

Vue.use(Vuex)

const debug = process.env.NODE_ENV !== ‘production‘

export default new Vuex.Store({
  actions,
  getters,
  state,
  mutations,
  strict: debug,
  plugins: debug ? [createLogger()] : []
})

2.getter.js

const getPoetryList = state => state.poetryList
const getPoetryItem = state => state.poetryItem
const getUserInfo = state => state.userinfo
const getcommentlists = state => state.commentlist

export {
  getPoetryList,
  getPoetryItem,
  getUserInfo,
  getcommentlists
}

3.mutation-types.js

const SET_POETRY_LIST = ‘SET_POETRY_LIST‘
const SET_POETRY_ITEM = ‘SET_POETRY_ITEM‘
const SET_USER_INFO = ‘SET_USER_INFO‘
const SET_COMMENT_LIST = ‘SET_COMMENT_LIST‘

export {
  SET_POETRY_LIST,
  SET_POETRY_ITEM,
  SET_USER_INFO,
  SET_COMMENT_LIST
}

4.mutation.js

import * as types from ‘./mutation-types‘

const mutations = {
  [types.SET_POETRY_LIST] (state, list) {
    state.poetryList = list
  },
  [types.SET_POETRY_ITEM] (state, item) {
    state.poetryItem = item
  },
  [types.SET_USER_INFO] (state, userinfo) {
    state.userinfo = userinfo
  },
  [types.SET_COMMENT_LIST] (state, commentlist) {
    state.commentlist = commentlist
  }
}

export default mutations

5.actions.js(用来进行异步操作)

四、设置过滤器(这里是一个简单的时间过滤器)

在common目录下的js文件夹内新建filter.js

 1 const forMatDate = utc => {
 2   if (utc) {
 3     let date = new Date(utc)
 4     let y = date.getUTCFullYear()
 5     let M = date.getUTCMonth() + 1 >= 10 ? date.getUTCMonth() + 1 : `0${date.getUTCMonth() + 1}`
 6     let d = date.getUTCDate() >= 10 ? date.getUTCDate() : `0${date.getUTCDate()}`
 7     let h = date.getUTCHours() + 8 >= 10 ? date.getUTCHours() + 8 : `0${date.getUTCHours() + 8}`
 8     let m = date.getUTCMinutes() >= 10 ? date.getUTCMinutes() : `0${date.getUTCMinutes()}`
 9     let s = date.getUTCSeconds() >= 10 ? date.getUTCSeconds() : `0${date.getUTCSeconds()}`
10     return `${y}-${M}-${d} ${h}:${m}:${s}`
11   }
12 }
13
14 export {
15   forMatDate
16 }

在main.js中设置过滤器

上面四个步骤,是一个vue项目的简单设置,当然不是很全面,但是对于我们这个项目却是足够了,至于里面用的的一些插件什么的,我们后面再一一介绍。。。。

原文地址:https://www.cnblogs.com/songdongdong/p/9407312.html

时间: 2024-09-28 15:04:42

一个关于vue+mysql+express的全栈项目(二)------ 前端构建的相关文章

一个关于vue+mysql+express的全栈项目(五)------ 实时聊天部分socket.io

一.基于web端的实时通讯,我们都知道有websocket,为了快速开发,本项目我们采用socket.io(客户端使用socket.io-client) Socket.io是一个WebSocket库,包括了客户端的js和服务器端的nodejs,它的目标是构建可以在不同浏览器和移动设备上使用的实时应用.它会自动根据浏览器从WebSocket.AJAX长轮询.Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,非常方便和人性化,而且支持的浏览器最低达IE5.5 socket.io特点: 实

一个关于vue+mysql+express的全栈项目(四)------ sequelize中部分解释

一.模型的引入 引入db.js const sequelize = require('./db') sequelize本身就是一个对象,他提供了众多的方法, const account = sequelize.model('account') //获取account这个模型 二,数据库基本操作(增.删.改.查) 增: account.create(data).then(doc => { const {user_name, user_id, user_info, avatar} = doc res

《从零开始做一个MEAN全栈项目》(1)

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 在本系列的开篇,我打算讲一下全栈项目开发的优势,以及MEAN项目各个模块的概览. 为什么选择全栈开发?     对于初学者来说,学习一门新的语言和技术的体验总是让人愉快的,也会满足于掌握了一些新的东西并且解决了一些实际问题.在一个小组中采用全栈开发时,你可以更加有效地把握项目全局概念,这也有利于让你了解项目中的不同模块以及它们之间是如何协同工作的.你会对你们的产品中他人的贡献更加清晰,你也就了解了这款产品如何

《从零开始做一个MEAN全栈项目》(2)

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习.   上一节简单介绍了什么是MEAN全栈项目,这一节将简要介绍三个内容:(1)一个通用的MEAN项目的技术架构,(2)为什么我们要打造单页应用,(3)本系列项目的技术架构和开发计划.希望通过这三个问题,我们能够对本项目产生一个全局视角. 实现一个常见的MEAN全栈项目的核心就是RESTful API.这个接口通常是用MongoDB, Express, Node.js实现的,而单页应用(SPA)由AngularJ

Vue+Node+MongoDB高级全栈开发

第1章 本地与服务器环境准备介绍微信公众号/小程序/域名/服务器的申请选购流程,在本地与线上服务器分别对项目的运行环境进行搭建部署,如 Node.js/Vue/Yarn/PM2/Nginx/MongoDB 等等,同时会来简单介绍下从本地通过 PM2 利用 Git 仓库直接往线上服务器部署以及 Nginx 端口映射解析特定域名的实现流程,最终准备好本地线上和外部业务环境为开发...1-1 导学1-2 课程简介1-3 申请认证公众服务号与小程序1-4 选购域名与备案解析域名1-5 选购配置服务器1-

VueCli3.0全栈项目-资金管理系统带权限(node/element/vue)

课程简介:通过本系列课程,可以快速的掌握全栈开发流程, 包括node.js的接口搭建, vue前端项目的构建, element-ui视图的构建. 一套应有尽有的课程! 课程目录:1.Vue全栈-最终成果展示.mp42.Node接口搭建-express搭建服务器.mp43.Node接口搭建-连接MongoDB数据库.mp44.Node接口搭建-搭建路由和数据模型.mp45.Node接口搭建-搭建注册接口并存储数据.mp46.Node接口搭建-使用全球公认头像gravatar.mp47.Node接口

前端面试题总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)持续更新 &#362414;

原文: http://blog.gqylpy.com/gqy/438 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我

全栈项目|小书架|服务器端-NodeJS+Koa2实现首页图书列表接口

通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 首页书籍信息 先来回顾一下首页书籍都有哪些信息: 从下面的图片可以看出目前一本图书信息主要有: 图片字段 名称字段 作者字段 出版社字段 除了以上前端页面中可见的信息外,在服务器开发中还需要给每一条记录(数据)都加上下面的几个字段: 创建时间字段 更新时间字段 删除时间字段 最后完成的数据库表如下: ps:由于数据库是直接导入的,之前的数据库是没有时间字段的,所以前

全栈项目|小书架|服务器端-NodeJS+Koa2 实现书籍详情接口

通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 书籍详情分析 书籍详情页面如下: 从上图可以分析出详情页面大概有以下几个接口: 获取书籍详情信息 获取用户对书籍的喜欢状态接口 喜欢/不喜欢书籍接口 获取评论列表 写评论接口 以上的接口,有的数据可以直接从已存在的数据表中去获取,比如:书籍详情信息,而其他新接口就需要创建对应的model,然后根据model创建相应的数据表. 比如 用户对书籍的喜欢操作,可以创建li