Skip to content

Commit 0d78614

Browse files
author
xrr2016
committed
📝 edit README
1 parent c5dd503 commit 0d78614

File tree

11 files changed

+121
-17
lines changed

11 files changed

+121
-17
lines changed

README.md

Lines changed: 106 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
# 一个简单的前后端分离案例
22

3-
使用到的框架和库
3+
4+
## 前言
5+
6+
在学习前端开发的过程中知了前后端分离这个概念
7+
[前后分离架构的探索之路](https://segmentfault.com/a/1190000003795517)
8+
[我们为什么要尝试前后端分离](https://segmentfault.com/a/1190000006240370)
9+
因此决定小试身手,项目中主要使用到的框架和库.
410

511
> vuejs vue-router musi-ui axios express mongoose mongodb......
612
713
## 简介
14+
815
一个前后端分离的案例,前端vuejs,后端express,数据库mongodb.
916
用express的提供api供前端调用,前端ajax请求进行对数据库的CURD操作.
1017

@@ -37,7 +44,9 @@ npm run dev
3744
接着把本地的mongodb服务跑起来,参考这篇[教程](https://segmentfault.com/a/1190000004868504)
3845

3946
## 后端开发
40-
不过首先把后端的服务搭好,方便以后前端调用,使用npm安装express,mongoose等必须的依赖即可,暂时不考虑验证等东西.
47+
- 官方文档 [express](http://www.expressjs.com.cn/) [mongoose](http://mongoosejs.com/docs/guide.html)
48+
49+
首先把后端的服务搭好,方便以后前端调用,使用npm安装express,mongoose等必须的依赖即可,暂时不考虑验证等东西.
4150
```bash
4251
npm install express body-parser mongoose --save
4352
```
@@ -52,6 +61,13 @@ app.listen(3000,() => {
5261
console.log('app listening on port 3000.')
5362
})
5463
```
64+
使用nodemon或babel-watch,方便开发
65+
```bash
66+
npm install nodemon --save-dev
67+
68+
nodemon app.js
69+
```
70+
5571
浏览器访问localhost:3000,出现res.send()的内容即表示成功.
5672

5773
然后添加需要的数据,新建一个models目录放数据模型,mongoose的每个数据model需要一个schema生成,
@@ -62,11 +78,89 @@ app.listen(3000,() => {
6278

6379
定义了title,poster,rating,introduction,created_at,update_at几个基本信息,最后将model导出即可.
6480

65-
接着将对数据CURD操作的几个路由写出来
81+
接着用mongoose链接mongodb,在app.js里添加
82+
```
83+
const mongoose = require('mongoose')
84+
mongoose.connect('mongodb://localhost:27017/yourDbName')
85+
```
86+
87+
链接数据库成功后,可以用Robomongo可视化工具或者在CMD里输入mongo命令查看数据库.
88+
89+
接着将对数据CURD操作的几个路由写出来,新建router文件夹,新建index.js和movie.js分别对应首页路由,和对数据
90+
91+
操作的路由,如下.
92+
- 首页路由 [index.js](./router/index.js)
93+
- 对数据操作的路由 [movie.js](./router/movie.js)
94+
95+
最后将路由应用到app.js
96+
```
97+
......
98+
const index = require('./router/index')
99+
const movie = require('./router/movie')
100+
......
101+
app.use('/',index)
102+
app.use('/api',movie)
103+
......
104+
```
105+
106+
使用Postman进行测试,测试成功的话,后端服务基本上就完成了.
107+
![测试](./demo/apiTest.png)
108+
66109
## 前端开发
110+
首先安装必要的依赖,看自己喜欢选择.
111+
[muse-ui](https://museui.github.io/#/index) [axios](https://github.com/mzabriskie/axios)
112+
```bash
113+
npm install musi-ui axios --save
114+
```
115+
然后把不要的文件删除,在src/components目录新建主要的两个组件List,Detail.
116+
List就是首页的列表,Detail是电影的详细数据,然后把前端路由写出来,在src/router建立前端路由文件,
117+
只有两个组件之间切换,然后把<router-view></router-view>放到App.vue里面就可以了.
118+
119+
前端路由
120+
![index.js](./demo/router.png)
121+
122+
数据获取,由于我们的express是在3000端口启动的,而前端开发在8080端口,由于跨域所以要配置好vue-cli的proxyTable
123+
选项,位于config/index.js,改写proxyTable.
124+
125+
![proxyTable](./demo/proxyTabel.png)
126+
这样当在前端用axios访问 '/api' 的时候,就会被代理到 'http://localhost:3000/api',从而获得需要的数据.
127+
128+
能够获取到数据之后就是编写界面了,由于用了muse-ui组件库,所以只要按着文档写一般不会错,要是不满意就自己搭界面.
129+
130+
主要就是用ajax访问后端对数据增删改查的路由,将这些操作都写在组件的methods对象里面,写好主要的方法后,将方法
131+
132+
......
133+
![listMethods01](./demo/listMethods01.png)
134+
![listMethods02](./demo/listMethods02.png)
135+
......
136+
137+
用vuejs里的写法,绑定到对应的按钮上
138+
```
139+
@click="methodName"
140+
```
141+
![methodBtn](./demo/methodBtn.png)
142+
143+
这样前端的开发就基本完成了.
144+
67145

68146
## 结语
69147

148+
前端开发完成后,就可以用webpack打包了,注意将config/index.js文件里面的productionSourceMap设为false,
149+
不然打包出来文件很大,最后用express.static中间件将webpack打包好的项目目录'dist'作为express静态文件服务的目录.
150+
151+
```bash
152+
npm run build
153+
```
154+
![build](./demo/build.png)
155+
156+
```
157+
app.use(express.static('dist'))
158+
```
159+
160+
最后案例完成后的目录结构就是这样.
161+
![project](./demo/project.png)
162+
163+
70164
## Build Setup
71165

72166
``` bash
@@ -81,9 +175,17 @@ npm run build
81175

82176
# build for production and view the bundle analyzer report
83177
npm run build --report
178+
179+
# 后端开发 localhost:3000
180+
npm run server
181+
182+
# webpack打包后,后端运行express静态目录'dist'
183+
npm run start
184+
84185
```
85-
written by [xrr2016](https://github.com/xrr2016)
86186

87187
## License
88188

89189
[MIT](https://opensource.org/licenses/MIT)
190+
191+
written by [xrr2016](https://github.com/xrr2016),欢迎issue,fork,star.

demo/apiTest.png

51.6 KB
Loading

demo/listMethods01.png

43.9 KB
Loading

demo/listMethods02.png

41.2 KB
Loading

demo/methodBtn.png

46.7 KB
Loading

demo/project.png

23.3 KB
Loading

demo/proxyTabel.png

24.4 KB
Loading

demo/router.png

23.4 KB
Loading

router/movie.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
const express = require('express')
22
const router = express.Router()
3-
const axios = require('axios')
4-
const https = require('https')
53
const Movie = require('../models/movie')
6-
const jsonBird = "https://bird.ioliu.cn/v1?url="
7-
const doubanMovie = "http://api.douban.com/v2/movie/search?q="
84

95
// 查询所有电影
106
router.get('/movie', (req, res) => {

src/components/Detail.vue

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,15 @@ export default {
4141
this.$router.go(-1)
4242
},
4343
getMovie(title) {
44-
const jsonBird = "https://bird.ioliu.cn/v1?url="
45-
const doubanSearch = 'http://api.douban.com/v2/movie/search?q='
46-
this.$http.get(`${jsonBird}${doubanSearch}${title}`)
44+
// 由于自定的movie模型没有足够的数据,故用前端请求豆瓣的api
45+
let searchUrl = 'https://bird.ioliu.cn/v1/?url=http://api.douban.com/v2/movie/search?q='
46+
this.$http.get(`${searchUrl}${title}`)
4747
.then(res => {
4848
console.log(res.data)
49-
const doubanMovie = 'http://api.douban.com/v2/movie/subject/'
50-
setTimeout(() => {
51-
let movieId = res.data.subjects[0].id
52-
},0)
49+
let movieUrl = 'https://bird.ioliu.cn/v1/?url=http://api.douban.com/v2/movie/subject'
50+
let movieId = res.data.subjects[0].id
5351
if(!!movieId){
54-
this.$http.get(`${jsonBird}${doubanMovie}${movieId}`)
52+
this.$http.get(`${movieUrl}/${movieId}`)
5553
.then(res => {
5654
console.dir(res.data)
5755
if (!!res.data) {

src/components/List.vue

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ export default {
7373
}
7474
},
7575
methods: {
76+
// 获取所有电影的方法
7677
getMovies() {
7778
this.$http.get('/api/movie')
7879
.then(res => {
@@ -84,9 +85,11 @@ export default {
8485
console.log(err)
8586
})
8687
},
88+
// 打开添加电影modal的方法
8789
openAddMovieModal() {
8890
this.addMovieModal = true
8991
},
92+
// 打开编辑电影modal的方法
9093
openEditMovieModal(movie) {
9194
this.editMovieModal = true
9295
this.title = movie.title
@@ -95,6 +98,7 @@ export default {
9598
this.poster = movie.poster
9699
this.movie_id = movie._id
97100
},
101+
// 关闭modal的方法
98102
closeModal() {
99103
this.addMovieModal = false
100104
this.editMovieModal = false
@@ -104,6 +108,7 @@ export default {
104108
this.introduction = ''
105109
this.movie_id = ''
106110
},
111+
// 访问后端添加电影的方法
107112
addMovie() {
108113
this.$http.post('/api/movie', {
109114
title: this.title,
@@ -127,13 +132,15 @@ export default {
127132
console.log(e)
128133
})
129134
},
135+
// 取消添加电影的方法
130136
cancelAddMovie() {
131137
this.addMovieModal = false
132138
this.title = ''
133139
this.rating = 0
134140
this.poster = ''
135141
this.introduction = ''
136142
},
143+
// 访问后端编辑电影的方法
137144
editMovie() {
138145
let id = this.movie_id
139146
this.$http.put(`/api/movie/${id}`, {
@@ -154,6 +161,7 @@ export default {
154161
})
155162
.catch(err => console.log(err))
156163
},
164+
// 删除电影的方法
157165
removeMovie(movie) {
158166
let id = movie._id
159167
this.$http.delete(`/api/movie/${id}`)
@@ -164,7 +172,7 @@ export default {
164172
})
165173
.catch(e => console.log(e))
166174
},
167-
searchMovie(title) {},
175+
// 跳转到电影详情页的方法
168176
showDetail(title) {
169177
this.$router.push(`/movie/${title}`)
170178
}

0 commit comments

Comments
 (0)