前后端分離項目案例

注意事項

? ? ? ? ? 1. 你的后臺的controller 一定是@RestController

? ?跨域問題:

1.項目使用的是axios請求網(wǎng)絡,將baseUrl修改為/api (這里是使用webpack提供的代理功能將/api代理成目標接口host)

axios.defaults.baseURL = '/api';

2.進入config/index.js里,在dev下增加proxyTable配置,可以匹配到/api,將其代理成目標接口host

dev: {

? ? // PathsassetsSubDirectory: 'static',

? ? assetsPublicPath: '/',//////////////////////////////////////////////////////////////? ? proxyTable: {

? ? ? '/api': {

? ? ? ? target: 'http://192.168.1.111:8080/',//目標接口域名changeOrigin:true,//是否跨域? ? ? ? pathRewrite: {? // 加上這個重寫配置后跨域問題就解決了

? ? ? ? ? '^/api': ''//重寫接口,后面可以使用重寫的新路徑,一般不做更改? ? ? ? }}? ? }//////////////////////////////////////////////////////////////}

此時已經(jīng)解決了dev下的跨域問題

3.進入package.json,在dev字段下增加 " --host 0.0.0.0 ",這樣就可以真機通過ip地址訪問項目,進行調(diào)試

"scripts": {

? ? "dev": "webpack-dev-server --host 0.0.0.0 --inline --progress --config build/webpack.dev.conf.js",

? ? "start": "npm run dev",

? ? "build": "node build/build.js"? }

1、前端vue的搭建

建立項目的過程略

開啟一個建立好的vue項目用npm run dev

關(guān)閉一個vue項目可在終端操作:ctrl+c

需要注意的幾點

1塔次、在建立項目的時候轧铁、可以選擇路由選項警绩。后續(xù)就不需要再次安裝路由已慢。

2、安裝axiosnpm install --save axios vue-axios

? ? ??axios 這個就是實現(xiàn)前后端分離的重要對象

前端項目結(jié)構(gòu)樣式

main.js亿乳、這個是整個項目的入口鲫售、要使用的在這里引入

// The Vue build version to load with the `import` command

// (runtime-only or standalone) has been set in webpack.base.conf with an alias.

import Vue from 'vue'

import './plugins/axios'

import App from './App'

import router from './router'

Vue.config.productionTip = false

/* eslint-disable no-new */

new Vue({

? el: '#app',

? router,

? components: { App },

? template: '<App/>'

})

app.vue

在這里可以定義跳轉(zhuǎn)到其他頁面的連接

<template>

? <div id="app">

? ? <router-link to="/user">book</router-link>

? ? <router-view/>

? </div>

</template>

<script>

export default {

? name: 'App'

}

</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>


配置的路由

在這里配置各個頁面跳轉(zhuǎn)的路由

import Vue from 'vue'

import Router from 'vue-router'

import UserList from '../components/UserList'

import Home from '../components/Home'

Vue.use(Router)

export default new Router({

? routes: [

? {

? ? path:'/user',

? ? component:UserList

? ? },

? ? {

? ? ? path:'/',

? ? ? component:Home

? ? }

? ]

})

組件1共螺、

<template>

? ? <div>

? ? ? 這里是首頁

? ? </div>

</template>

<script>

? ? export default {

? ? ? ? name: "Home"

? ? }

</script>

<style scoped>

</style>

組件2

(每個組件之間都可以和后臺數(shù)據(jù)交互通過axios)

提示: const _this =this變量的設置,否則會和回調(diào)函數(shù)搞混

這里和后臺進行連接是通過url情竹。這里的url是訪問某一個接口的url,就相當于和某個方法進行打通

<template>

? ? <div>

? ? ? <table class="_table">

? ? ? ? <tr class="_tr">

? ? ? ? ? <td>姓名</td>

? ? ? ? ? <td>年齡</td>

? ? ? ? ? <td>郵箱</td>

? ? ? ? </tr>

? ? ? ? <tr v-for="item in books ">

? ? ? ? ? <td>{{item.bookAuthor}}</td>

? ? ? ? ? <td>{{item.bookName}}</td>

? ? ? ? ? <td>{{item.price}}</td>

? ? ? ? </tr>

? ? ? </table>

? ? </div>

</template>

<script>

? ? export default {

? ? ? ? name: "UserList",

? ? ? data(){

? ? ? ? ? return{

? ? ? ? ? ? books:[

? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? bookName:'java',

? ? ? ? ? ? ? ? bookAuthor:'小黑',

? ? ? ? ? ? ? ? price:'33'

? ? ? ? ? ? ? }

? ? ? ? ? ? ]

? ? ? ? ? }

? ? ? },

? ? ? created() {

? ? ? ? ? const _this =this

? ? ? ? ? axios.get('http://localhost:8181/book/findAll').then(function(resp){

? ? ? ? _this.books=resp.data

? ? ? ? ? })

? ? ? }

? ? }

</script>

<style scoped>

table,td{

? border: 1px solid silver;

}

</style>

2藐不、后端項目的構(gòu)建

首先構(gòu)建項目

目錄結(jié)構(gòu)這個樣子

pom文件中引入的jar包

我目前只用到mysql,shiro用來做后續(xù)的權(quán)限安全驗證

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

? ? ? ? <!--整合shiro

? ? ? ? ? subject:用戶

? ? ? ? ? security manager:管理所有的用戶

? ? ? ? ? realm:連接數(shù)據(jù)庫

? ? ? -->

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.apache.shiro</groupId>

? ? ? ? ? ? <artifactId>shiro-spring</artifactId>

? ? ? ? ? ? <version>1.4.1</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>com.github.theborakompanioni</groupId>

? ? ? ? ? ? <artifactId>thymeleaf-extras-shiro</artifactId>

? ? ? ? ? ? <version>2.0.0</version>

? ? ? ? </dependency>

<!--整合mybatis-->

<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>2.1.0</version>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!--? JDBC-->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-jdbc</artifactId>

</dependency>

<!--? Mysql-->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid</artifactId>

<version>1.1.6</version>

</dependency>

</dependencies>

yml文件用來配置連接數(shù)據(jù)庫和端口的設置

spring:

? datasource:

? ? username: root

? ? password: root

? ? url: jdbc:mysql://localhost:3306/ssmbuild?allowMultiQueries=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false

? ? driver-class-name: com.mysql.cj.jdbc.Driver

? ? type: com.alibaba.druid.pool.DruidDataSource

? ? #spring boot 默認是不注入這些屬性的秦效,需要自己綁定

? ? #druid 數(shù)據(jù)源專有配置

? ? initiaSize: 5

? ? minIdle: 5

? ? maxActive: 20

? ? maxWait: 60000

? ? timeBetweenEvictionRunsmMillis: 60000

? ? minEvictableIdleTimeMillis: 300000

? ? validationQuery: SELECT 1 FROM DUAL

? ? testWhileIdle: true

? ? testOnBorrow: false

? ? testOnReturn: false

? ? poolPreparedStatements: true

? ? filters: stat,wall,log4j

? ? maxPoolPrepareStatementPerConnectionSize: 20

? ? useGlobalDataSourceStat: true

? ? connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

server:

? port: 8181

application.property進行一些整合

spring.aop.auto=true

#整合mybatis

mybatis.type-aliases-package=com.zheng.pojo

mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

controller層(這里返回給前端的數(shù)據(jù)用json)

這里使用RestController返回的就是return的內(nèi)容

知識點:@RestController注解相當于@ResponseBody + @Controller合在一起的作用雏蛮。

如果需要返回JSON,XML或自定義mediaType內(nèi)容到頁面阱州,則需要在對應的方法上加上@ResponseBody注解挑秉。

package com.zheng.controller;

import com.zheng.pojo.Books;

import com.zheng.service.BookService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController

@RequestMapping("/book")

public class BooksController {

? ? @Autowired

? ? BookService bookService;

? ? //查詢所有的書籍信息

? ? @GetMapping("/findAll")

? ? public List<Books> findAll() {

? ? ? ? return bookService.queryBookList();

? ? }

}

service層

package com.zheng.service;

import com.zheng.pojo.Books;

import java.util.List;

public interface BookService {

? ? /**

? ? * 查詢圖書

? ? */

? ? public List<Books> queryBookList();

}

imp層

package com.zheng.service.serviceImpl;

import com.zheng.mapper.BooksMapper;

import com.zheng.pojo.Books;

import com.zheng.service.BookService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import java.util.List;

@Service

public class BookServiceImpl implements BookService {

? ? @Autowired

? ? BooksMapper booksMapper;

? //查詢書籍

? ? @Override

? ? public List<Books> queryBookList() {

? ? ? ? return booksMapper.queryBookList() ;

? ? }

}

dao層

package com.zheng.mapper;

import com.zheng.pojo.Books;

import org.apache.ibatis.annotations.Mapper;

import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper? ? //這個注解表示這個是mybatis的mapeper

@Repository

public interface BooksMapper {

? ? /**

? ? * 查詢圖書

? ? */

? public List<Books> queryBookList();

}

mapper

、這個位置

<?xml version="1.0" encoding="UTF8"?>

<!DOCTYPE mapper

? ? ? ? PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

? ? ? ? "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.zheng.mapper.BooksMapper">

? ? <select id="queryBookList" resultType="com.zheng.pojo.Books">

? ? ? ? select * from bookss

? ? </select>

</mapper>

實體類

可以使用Lombok苔货、我不喜歡使用

package com.zheng.pojo;

public class Books {

? ? private String bookId;

? ? private String bookName;

? ? private String bookAuthor;

? ? private Double price;

? ? private String address;

? ? private String impression;

? ? private String introduce;

? ? public Books(String bookId, String bookName, String bookAuthor, Double price, String address, String impression, String introduce) {

? ? ? ? this.bookId = bookId;

? ? ? ? this.bookName = bookName;

? ? ? ? this.bookAuthor = bookAuthor;

? ? ? ? this.price = price;

? ? ? ? this.address = address;

? ? ? ? this.impression = impression;

? ? ? ? this.introduce = introduce;

? ? }

? ? public Double getPrice() {

? ? ? ? return price;

? ? }

? ? public void setPrice(Double price) {

? ? ? ? this.price = price;

? ? }

? ? public Books() { }

? ? public String getBookId() {

? ? ? ? return bookId;

? ? }

? ? public void setBookId(String bookId) {

? ? ? ? this.bookId = bookId;

? ? }

? ? public String getBookName() {

? ? ? ? return bookName;

? ? }

? ? public void setBookName(String bookName) {

? ? ? ? this.bookName = bookName;

? ? }

? ? public String getBookAuthor() {

? ? ? ? return bookAuthor;

? ? }

? ? public void setBookAuthor(String bookAuthor) {

? ? ? ? this.bookAuthor = bookAuthor;

? ? }

? ? public String getAddress() {

? ? ? ? return address;

? ? }

? ? public void setAddress(String address) {

? ? ? ? this.address = address;

? ? }

? ? public String getImpression() {

? ? ? ? return impression;

? ? }

? ? public void setImpression(String impression) {

? ? ? ? this.impression = impression;

? ? }

? ? public String getIntroduce() {

? ? ? ? return introduce;

? ? }

? ? public void setIntroduce(String introduce) {

? ? ? ? this.introduce = introduce;

? ? }

}

額外寫一個類犀概、解決跨域問題

package com.zheng.config;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.CorsRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration

public class CrosConfig implements WebMvcConfigurer {

? ? public void addCorsMappings(CorsRegistry registry){

? ? ? ? registry.addMapping("/**")

? ? ? ? ? ? ? ? .allowedOriginPatterns("*")

? ? ? ? ? ? ? ? .allowedMethods("GET","HEAD","POST","PUT","DELETE","OPTIONS")

? ? ? ? ? ? ? ? .allowCredentials(true)

? ? ? ? ? ? ? ? .maxAge(3600)

? ? ? ? ? ? ? ? .allowedHeaders("*");

? ? }

}

遇到的問題:

在測試從數(shù)據(jù)庫取數(shù)據(jù)的時候,那個測試類出了問題夜惭。根本原因是spring boot的啟動類沒有放在根目錄姻灶。

3、測試

第一步诈茧、1产喉、開啟后端服務

第二步、開啟前端服務

看頁面效果

點擊book

這個是從后端請求來的數(shù)據(jù)。沒做樣式曾沈、簡單打通尘颓、可以使用elementui讓頁面更加美觀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晦譬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子互广,更是在濱河造成了極大的恐慌敛腌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惫皱,死亡現(xiàn)場離奇詭異像樊,居然都是意外死亡,警方通過查閱死者的電腦和手機旅敷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門生棍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人媳谁,你說我怎么就攤上這事涂滴。” “怎么了晴音?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵柔纵,是天一觀的道長。 經(jīng)常有香客問我锤躁,道長搁料,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任系羞,我火速辦了婚禮郭计,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椒振。我一直安慰自己昭伸,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布杠人。 她就那樣靜靜地躺著勋乾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嗡善。 梳的紋絲不亂的頭發(fā)上辑莫,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音罩引,去河邊找鬼各吨。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的揭蜒。 我是一名探鬼主播横浑,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屉更!你這毒婦竟也來了徙融?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤瑰谜,失蹤者是張志新(化名)和其女友劉穎欺冀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萨脑,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡隐轩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了渤早。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片职车。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鹊杖,靈堂內(nèi)的尸體忽然破棺而出悴灵,到底是詐尸還是另有隱情,我是刑警寧澤骂蓖,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布称勋,位于F島的核電站,受9級特大地震影響涯竟,放射性物質(zhì)發(fā)生泄漏赡鲜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一庐船、第九天 我趴在偏房一處隱蔽的房頂上張望银酬。 院中可真熱鬧,春花似錦筐钟、人聲如沸揩瞪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽李破。三九已至,卻和暖如春壹将,著一層夾襖步出監(jiān)牢的瞬間嗤攻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工诽俯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妇菱,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像闯团,于是被迫代替她去往敵國和親辛臊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容