Day 08 前后端分離開(kāi)發(fā)綜合練習(xí)

準(zhǔn)備工作:

確保Idea和Hbulider正常工作之外岖研,還要安裝好數(shù)據(jù)庫(kù)軟件,比如MySQL挖垛,后臺(tái)測(cè)試接口軟件Postman(提前注冊(cè)好)

前后端分離開(kāi)發(fā)的意義:

知乎:Web 前后端分離的意義大嗎伴嗡?
《淺談架構(gòu)之路:前后端分離模式》

一迅皇、后臺(tái)部分

大致順序總覽

1.根據(jù)需求,分析數(shù)據(jù)庫(kù),建庫(kù)嫉你,建表月帝,準(zhǔn)備數(shù)據(jù)
2.建立web模塊,webapp類型的maven項(xiàng)目
3.手動(dòng)創(chuàng)建src(藍(lán)色)幽污,resources嚷辅,test(綠色)—java目錄
4.建立package,entity距误,dao簸搞,service,controller
5.添加pom依賴:web模塊依賴准潭,webmvc模塊依賴趁俊,jackson相關(guān)依賴
6.創(chuàng)建entity實(shí)體類
7.dao接口,用注解的方式增加自定義的復(fù)雜關(guān)聯(lián)語(yǔ)句
8.service接口刑然,注入dao寺擂,調(diào)用相關(guān)方法
9.用Junit對(duì)service做單元測(cè)試
10.controller,使用RESTful風(fēng)格請(qǐng)求泼掠,完成控制層
11.用postman對(duì)controller進(jìn)行測(cè)試怔软,杜絕一切404,500

  • 建立數(shù)據(jù)庫(kù)db_spring,分別建立表t_sys_user,t_course


    t_sys_user

    t_course
  • 表建完之后,自己添加幾條數(shù)據(jù)
  • 在idea中創(chuàng)建好web項(xiàng)目以及相應(yīng)的包


    結(jié)構(gòu)如圖
  • 按照順序一步步完成代碼择镇,代碼已經(jīng)上傳到github的web項(xiàng)目中挡逼,地址如下:
    github地址
  • 配置tomacat服務(wù)器


    1

    2

    3

    4

    5
  • 設(shè)置完記得先aply,再點(diǎn)擊ok


    6

    測(cè)試

    配置成功
  • service單元測(cè)試通過(guò)之后腻豌,開(kāi)始進(jìn)行controller測(cè)試挚瘟,使用postman


    測(cè)試
到這里,后臺(tái)工作大致也結(jié)束了

二、前端部分

  • 將后臺(tái)數(shù)據(jù)通過(guò)頁(yè)面展示出來(lái)
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Vue.js-訪問(wèn)API接口數(shù)據(jù)-藍(lán)墨云班課練習(xí)</title>
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1,user-scalable=no">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <!-- 通過(guò)CDN引入Vue.js -->
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <!-- 通過(guò)CDN引入axios -->
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
        <style type="text/css">
            body {
                background-color: #eee;
            }
            .top {
                width: 80%;
                margin: 0 auto;
                display: flex;
                justify-content: space-between;
            }
            hr{
                width: 80%;
                color: #efefef;
            }
            .container {
                width: 80%;
                margin: 0 auto;
                display: flex;
                flex-wrap: wrap;
                padding-left: 20px;
                padding-top: 10px;
            }
            .card {
                width: 190px;
                display: flex;
                flex-direction: column;
                border: 1px solid #eee;
                margin-right: 20px;
                margin-bottom: 10px;
                background-color: #fff;
                justify-content: center;
                padding-left: 5px;
                padding-right: 5px;
                padding-top: 5px;
            }
            .card img {
                width: 100%;
            }
            p {
                font-size: 12px;
                margin-bottom: 5px;
            }
            .teacher {
                display: flex;
                justify-content: space-between;
            }
            .left {
                display: flex;
            }
            .avatar img {
                width: 30px;
                height: 30px;
                border-radius: 50%;
                margin-right: 5px;
            }
            .code {
                color: #00BBDD;
                margin-top: 5px;
            }
            .bottom {
                width: 80%;
                margin: 0 auto;
                display: flex;
                justify-content: space-between;
            }
            .container1 {
                width: 80%;
                margin: 0 auto;
                display: flex;
                flex-wrap: wrap;
                padding-left: 20px;
                padding-top: 10px;
            }
            .card1 {
                width: 190px;
                display: flex;
                flex-direction: column;
                border: 1px solid #eee;
                margin-right: 20px;
                margin-bottom: 10px;
                background-color: #fff;
                justify-content: center;
                padding-left: 5px;
                padding-right: 5px;
                padding-top: 5px;
                -webkit-filter: grayscale(1);
            }
            
        </style>
    </head>
    <body>
        <div id="app">
            <div class="top">
                <p>進(jìn)行中的班課</p>
                <p>{{courses.length}}個(gè)進(jìn)行中的班課</p>
            </div>
            <hr>
            <div class="container">
                <div class="card" v-for="(course, index) in courses" :key="index">
                    <div class="cover">
                        <img :src="'img/'+course.cover">
                    </div>
                    <div class="course-class">
                        <p>{{course.courseClass}}</p>
                    </div>
                    <div class="course-name">
                        <p>{{course.courseName}}</p>
                    </div>
                    <div class="teacher">
                        <div class="left">
                            <div class="avatar">
                                <img :src="'img/'+course.avatar">
                            </div>
                            <div class="username">
                                <p class="code">{{course.username}}</p>
                            </div>
                        </div>
                        <div class="course-code">
                            <p class="code" v-if="loginUserId === course.userId">{{course.courseCode}}</p>
                        </div>
                    </div>
                </div>

            </div>
            <div class="bottom">
                <p>已結(jié)束的班課</p>
                <p>{{courses1.length}}個(gè)已經(jīng)結(jié)束的班課</p>
            </div>
            <hr>
            <div class="container1">
                <div class="card1" v-for="(course, index) in courses1" :key="index">
                    <div class="cover">
                        <img :src="'img/'+course.cover">
                    </div>
                    <div class="course-class">
                        <p>{{course.courseClass}}</p>
                    </div>
                    <div class="course-name">
                        <p>{{course.courseName}}</p>
                    </div> 
                    <div class="teacher">
                        <div class="left">
                            <div class="avatar">
                                <img :src="'img/'+course.avatar">
                            </div>
                            <div class="username">
                                <p class="code">{{course.username}}</p>
                            </div>
                        </div>
                        <div class="course-code">
                            <p class="code" v-if="loginUserId === course.userId">{{course.courseCode}}</p>
                        </div>
                    </div>
                </div>
            
            </div>
        </div>
        <script type="text/javascript">
            var app = new Vue({
                el: '#app',
                data: {
                    loginUserId: 2,
                    courses: [],
                    courses1: []
                },
                created: function() {
                    var _this = this;
                    axios.get('http://127.0.0.1:8080/web/courses')
                        .then(function(response) {
                            console.log(response.data);
                            _this.courses = response.data;
                        }),
                       axios.get('http://127.0.0.1:8080/web/fin-courses')
                        .then(function(response) {
                            console.log(response.data);
                            _this.courses1 = response.data;
                        })
                }
            })
        </script>
    </body>
</html>

tips:對(duì)圖片加上一層黑白色:-webkit-filter: grayscale(1)
效果演示:

演示

修改數(shù)據(jù)庫(kù)

刷新頁(yè)面

注意點(diǎn):

1饲梭、文件命名要符合規(guī)范乘盖,存放位置一定要保證正確合理
2、數(shù)據(jù)庫(kù)中主鍵屬性為bignit憔涉,在idea中為L(zhǎng)ong(L要大寫)
3订框、要按照步驟來(lái)編寫后臺(tái)代碼,單元測(cè)試要保證通過(guò)兜叨,結(jié)果合理
4穿扳、一定要保證Tomcat服務(wù)器配置正確
5、postman測(cè)試要杜絕404等一切錯(cuò)誤
6国旷、在寫完前端代碼進(jìn)行測(cè)試時(shí)矛物,tomacat服務(wù)器不能關(guān)閉,不然數(shù)據(jù)跳轉(zhuǎn)不過(guò)去

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跪但,一起剝皮案震驚了整個(gè)濱河市履羞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖忆首,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爱榔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡糙及,警方通過(guò)查閱死者的電腦和手機(jī)详幽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)浸锨,“玉大人唇聘,你說(shuō)我怎么就攤上這事≈眩” “怎么了雳灾?”我有些...
    開(kāi)封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)冯凹。 經(jīng)常有香客問(wèn)我谎亩,道長(zhǎng),這世上最難降的妖魔是什么宇姚? 我笑而不...
    開(kāi)封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任匈庭,我火速辦了婚禮,結(jié)果婚禮上浑劳,老公的妹妹穿的比我還像新娘阱持。我一直安慰自己,他們只是感情好魔熏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布衷咽。 她就那樣靜靜地躺著,像睡著了一般蒜绽。 火紅的嫁衣襯著肌膚如雪镶骗。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天躲雅,我揣著相機(jī)與錄音鼎姊,去河邊找鬼。 笑死相赁,一個(gè)胖子當(dāng)著我的面吹牛相寇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钮科,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼唤衫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绵脯?” 一聲冷哼從身側(cè)響起佳励,我...
    開(kāi)封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤休里,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后植兰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡璃吧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年楣导,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畜挨。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筒繁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巴元,到底是詐尸還是另有隱情毡咏,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布逮刨,位于F島的核電站呕缭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏修己。R本人自食惡果不足惜恢总,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望睬愤。 院中可真熱鬧片仿,春花似錦、人聲如沸尤辱。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)光督。三九已至阳距,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間结借,已是汗流浹背娄涩。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留映跟,地道東北人蓄拣。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像努隙,于是被迫代替她去往敵國(guó)和親球恤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349