利用Spring boot+react快速搭建一個(gè)博客站點(diǎn)(前后端完全分離)

使用到的技術(shù)
spring boot
spring data jpa
spring data rest
react.js
fetch.js
material-ui

先把要點(diǎn)記一下:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>backend</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.6</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

blog.java

package com.example.domain;

import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.io.Serializable;

/**
 * Created by yiminluo on 28/11/2016.
 */
@Entity
@Data
@NoArgsConstructor
public class Blog implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    @Column(nullable = false)
    private String title;
    @Column(nullable = false)
   private String content;
    @Column(columnDefinition = "DATE")
   private String createTime;
   private String tag;

    public Blog(String title,String content,String createTime,String tag){
        this.title=title;
        this.content=content;
        this.createTime=createTime;
        this.tag=tag;
    }

}

@BlogRepository

package com.example.domain;
import org.springframework.data.repository.CrudRepository;
public interface BlogRepository extends CrudRepository<Blog,Long> {
}

DatabaseLoader.java

@Component
public class DatabaseLoader implements CommandLineRunner {

   private final BlogRepository blogRepository;
    @Autowired
    DatabaseLoader (BlogRepository blogRepository){
        this.blogRepository=blogRepository;
    }


    @Override
    public void run(String... strings) throws Exception {
        blogRepository.save(
                new Blog("test blog","this is just a test blog","2016-01-01","js")
        );
    }
}```



application.propeties

spring.data.rest.base-path=/api


DemoApplication.java

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@SpringBootApplication//等價(jià)與以默認(rèn)屬性使用@Configuration歉甚,@EnableAutoConfiguration和@ComponentScan
public class DemoApplication {

  //允許跨域請(qǐng)求
@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/").allowedOrigins("http://localhost:3000");
        }
    };
}

public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
}

}



#前臺(tái)

package.json

{
"name": "myblog",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "WEBPACK_ENV=dev webpack-dev-server --host 127.0.0.1 --port 3000 --devtool eval --progress --colors --hot --content-base dist",
"build": "WEBPACK_ENV=build ./node_modules/.bin/webpack"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"material-ui": "^0.16.4",
"react": "^15.3.2",
"react-dom": "^15.3.2",
"react-tap-event-plugin": "^1.0.0",
"whatwg-fetch": "^2.0.1"
},
"devDependencies": {
"babel-core": "^6.18.2",
"babel-loader": "^6.2.7",
"babel-preset-es2015": "^6.18.0",
"babel-preset-react": "^6.16.0",
"css-loader": "^0.25.0",
"html-webpack-plugin": "^2.24.1",
"react-hot-loader": "^1.3.0",
"style-loader": "^0.13.1",
"webpack": "^1.13.3",
"webpack-dev-server": "^1.16.2"
}
}


webpack.config.js
    var webpack = require('webpack');
    var path = require('path');
    var HtmlwebpackPlugin = require('html-webpack-plugin');
    

    var env = process.env.WEBPACK_ENV;
    var outputFile;
    var plugins = [
    new HtmlwebpackPlugin({
        title: 'React BiolerPlate by monodev',
        template : path.resolve(__dirname,"templates/index.template.html"),
        inject:'body'
    })
    ];

    if (env==='build') {
        var UglifyJsPlugin = webpack.optimize.UglifyJsPlugin;
        plugins.push(new UglifyJsPlugin({minimize:true}));
        outputFile = 'bundle.min.js';
    }
    else{
        outputFile = 'bundle.js';
    }

    var config = {
        entry : [
        'whatwg-fetch',
        'webpack/hot/dev-server',
        'webpack-dev-server/client?http://localhost:3000',
            './app/index.jsx'      //入口文件
            ],
            output : {
                path: path.resolve(__dirname,'dist'),
                filename: 'bundle.js',
            },
            module :{
                loaders :[
                {
                    test: /\.css$/,
                    loader: 'style!css',
                    include: path.resolve(__dirname, 'app')
                },
                { 
                    test: /\.jsx?$/, 
                    loader: 'babel',
                    exclude: /node_modules/,
                    query: {
                        presets: ['es2015', 'react'] 
                    }
                }
                ]
            },
            resolve: {
                extensions: ['', '.js', '.jsx']
            },
            plugins : plugins
        }

        module.exports = config;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稽犁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子向族,更是在濱河造成了極大的恐慌路媚,老刑警劉巖澄者,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锥涕,死亡現(xiàn)場(chǎng)離奇詭異病游,居然都是意外死亡唇跨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門衬衬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來买猖,“玉大人,你說我怎么就攤上這事滋尉∮窨兀” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵狮惜,是天一觀的道長(zhǎng)高诺。 經(jīng)常有香客問我碌识,道長(zhǎng),這世上最難降的妖魔是什么虱而? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任筏餐,我火速辦了婚禮,結(jié)果婚禮上牡拇,老公的妹妹穿的比我還像新娘魁瞪。我一直安慰自己,他們只是感情好惠呼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布佩番。 她就那樣靜靜地躺著,像睡著了一般罢杉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贡歧,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天滩租,我揣著相機(jī)與錄音,去河邊找鬼利朵。 笑死律想,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绍弟。 我是一名探鬼主播技即,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼樟遣!你這毒婦竟也來了而叼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤豹悬,失蹤者是張志新(化名)和其女友劉穎葵陵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞻佛,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脱篙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伤柄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绊困。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖适刀,靈堂內(nèi)的尸體忽然破棺而出秤朗,到底是詐尸還是另有隱情,我是刑警寧澤蔗彤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布川梅,位于F島的核電站疯兼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贫途。R本人自食惡果不足惜吧彪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丢早。 院中可真熱鬧姨裸,春花似錦、人聲如沸怨酝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽农猬。三九已至赡艰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斤葱,已是汗流浹背慷垮。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揍堕,地道東北人料身。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像衩茸,于是被迫代替她去往敵國和親芹血。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理楞慈,服務(wù)發(fā)現(xiàn)幔烛,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,808評(píng)論 6 342
  • jHipster - 微服務(wù)搭建 CC_簡(jiǎn)書[http://www.reibang.com/u/be0d56c4...
    quanjj閱讀 810評(píng)論 0 2
  • springboot配置選項(xiàng)(一) =======================================...
    JanloongDo_0閱讀 4,795評(píng)論 0 3
  • 當(dāng)科技高于人類基礎(chǔ)抖部,將會(huì)帶來什么说贝?人類一直在追求科技進(jìn)步,科技是否會(huì)超越人類發(fā)展慎颗?
    YEEN閱讀 187評(píng)論 0 0