beego開發(fā)輕博客——第七講 文章的顯示嵌戈、修改與刪除

【小雞創(chuàng)作】beego開發(fā)輕博客

本章目標:添加“文章的顯示脚囊、修改與刪除”功能
github: 打開后徊都,點擊右上角star按鈕
視頻教程: B站地址


文章顯示

1. 功能分析

文章的顯示功能,首先我們需要添加路由支示,約定文章顯示的路由路徑為"/details/[文章的key]"刊橘,再添加路由對應的控制器,我們需要根據(jù)key查找到文章的記錄颂鸿,返回給頁面促绵。
根據(jù)文字的key查詢文章的數(shù)據(jù)庫方法,我們之前在新增文章的時候已經(jīng)添加嘴纺。

2. 控制器邏輯調(diào)整

2.1 修改controllers->index.go添加GetDetails败晴,查詢文章信息返回給頁面,代碼如下(請留意代碼中的注解栽渴,都是邏輯說明):
//@router /details/:key [get]
func (this *IndexController) GetDetails() {
    //得到頁面?zhèn)鬟^來的文章的key
    key:= this.Ctx.Input.Param(":key")
    //到數(shù)據(jù)庫中根據(jù)key查詢文章
    note,err:=models.QueryNoteByKey(key)
    if err!=nil{
         //查詢有問題位衩,就提示頁面文章不存在
        this.Abort500(syserror.New("文章不存在",err))
    }
    //將文章的信息放回給頁面
    this.Data["note"] = note
    this.TplName="details.html"
}

3. 前臺頁面調(diào)整

3.1 我們修改views->index.html 頁面,修改跳轉(zhuǎn)文章詳情的鏈接熔萧,改成我們定義好的路由路徑糖驴。修改代碼如下
...
<div class="item-box  layer-photos-demo1 layer-photos-demo">
    <!-- 此處拼寫 文章詳情路由路徑 -->
    <h3><a href="details/{{.Key}}">{{.Title}}</a></h3>
    <h5>發(fā)布于:<span>{{date .UpdatedAt "Y-m-d H:i:s"}}</span></h5>
...
3.1 我們修改views->index.html 頁面,將文章摘要信息顯示的部分抽取出來保存為模版佛致,并且新增文件views->comm->note_summary_tpl.html贮缕。

3.1.1 views->index.html 修改代碼如下

{{ range .notes}}
<div class="item">
{{template "comm/note_summary_tpl.html" .}}
<div class="comment count">
    ...
</div>
{{end}}

3.1.2 views->comm->note_summary_tpl.html修改代碼如下

<div class="item-box  layer-photos-demo1 layer-photos-demo">
    <h3><a href="details/{{.Key}}">{{.Title}}</a></h3>
    <h5>發(fā)布于:<span>{{date .UpdatedAt "Y-m-d H:i:s"}}</span></h5>
    <p>{{.Summary}}</p>
</div>
3.2 我們復制文件views->comm->note_summary_tpl.html保存為views->comm->note_tpl.html修改其中的代碼將顯示文章摘要改成顯示文章的內(nèi)容,修改代碼如下
...
    <!--原代碼是:<p>{{.Summary}}</p>-->
    <!--go的html模版輸出默認是對html標簽轉(zhuǎn)義的-->
    <!--str2html是beego提供的方法俺榆,可以將字符串直接輸出不轉(zhuǎn)義-->
    <p>{{str2html .Content}}</p>
...
3.3 我們修改views->details.html 頁面感昼,嵌入views->comm->note_tpl.html模版頁面,顯示文章內(nèi)容罐脊,修改代碼如下
...
<div class="item-box  layer-photos-demo1 layer-photos-demo">
    <!--此處為修改-->
    <!--請注意 后面?zhèn)鞯氖?note作為通道傳給模版-->
    {{template "comm/note_tpl.html" .note }}
    <div class="count layui-clear">
     
...

文章的顯示功能已經(jīng)實現(xiàn)


文章修改

1. 功能分析

1定嗓、我們需要給文章修改功能添加操作入口,我們使用layui提供的fixbar作為操作按鈕萍桌。
2宵溅、頁面需要的數(shù)據(jù):我們要判斷用戶是否登陸,用戶是否有修改文章的權(quán)限上炎,同時我們也有判斷當前的用戶id是否和當前文章所屬用戶的id相等恃逻,只有滿足這些條件才能對文章進行修改和刪除的操作。修改文章時我們需要帶入文章的key藕施。因此我們要拿到當前登陸的用戶的信息寇损,還要拿到當前文章詳情頁面的文章的所屬用戶的id和文章的key值。
3裳食、頁面要拿到當前登陸的用戶的信息矛市,我們要將用戶信息保存到html頁面中類型為json對象的user變量。為了得到user的json對象诲祸,我們需要定義“gorm定義表結(jié)構(gòu)的結(jié)構(gòu)體”的json輸出的格式浊吏。
4憨愉、我們定義修改文章的路由路徑為:/edit/[當前文章的key],然后路由對應的控制器方法的邏輯是:根據(jù)key和當前登陸的用戶找到文章數(shù)據(jù)(這兒我們需要新增數(shù)據(jù)庫方法)卿捎,指定渲染模版note_new.html配紫,修改note_new.html,使其能夠顯示文章具體信息午阵。而note_new.html模版躺孝,在文章新增的時候,我們就已經(jīng)支持文章修改的功能底桂,我們只需修改文章保存的控制器方法植袍,添加保存后返回的跳轉(zhuǎn)頁面路徑,跳轉(zhuǎn)到文章詳情頁面籽懦。

2. 數(shù)據(jù)庫邏輯調(diào)整

2.1 添加根據(jù)用戶id和文章的key查詢文章的方法于个,修改models->note.go文件,添加QueryNoteByKeyAndUserId方法暮顺,代碼如下:
func QueryNoteByKeyAndUserId(key string, userid int) (note Note, err error) {
    return note, db.Where("key = ? and user_id = ? ", key, userid).Take(&note).Error
}
2.2 目前定義數(shù)據(jù)庫表結(jié)構(gòu)的結(jié)構(gòu)體都是繼承g(shù)orm自帶的model結(jié)構(gòu)體厅篓,而gorm的model的結(jié)構(gòu)體,沒法重新定義json輸出的格式捶码,因此羽氮,我們重新定義model的結(jié)構(gòu)體并定義json的格式。修改models->core.go文件惫恼,添加代碼如下
// `json:"name"` 這句是定義json輸出的格式
type Model struct {
    ID        uint `gorm:"primary_key" json:"id"`
    CreatedAt time.Time `json:"created_at"`
    UpdatedAt time.Time `json:"updated_at"`
    DeletedAt *time.Time `sql:"index" json:"deleted_at"`
}
2.3 修改models->note.go档押,修改代碼如下
type Note struct {
    Model//這兒的Model是我們上面定義的Model不是gorm.Model
    ...
}
2.4 修改models->user.go,優(yōu)化用戶結(jié)構(gòu)體的json輸出的格式祈纯,修改代碼如下
type User struct {
    Model //這兒的Model是我們上面定義的Model不是gorm.Model
    Name string `gorm:"unique_index" json:"name"`
    Email string `gorm:"unique_index" json:"email"`
    Pwd string `json:"-"`//“-” 代表不輸出令宿,密碼不能輸出到頁面。
    Avatar string `json:"avatar"`
    Role int  `json:"role"`
}

3. 控制器邏輯調(diào)整

3.1 添加編輯頁面的路由/edit/:key,添加控制器邏輯:查詢文章并顯示文章修改頁面腕窥。修改controllers->note.go文件粒没,添加如下代碼:
// @router /edit/:key [get]
func (this *NoteController) EditPage() {
    // 獲取頁面?zhèn)鬟^來key
    key := this.Ctx.Input.Param(":key")
    //根據(jù)當前文章的key和登陸用戶id查詢出,文章信息油昂。
    note, err := models.QueryNoteByKeyAndUserId(key, int(this.User.ID))
    if err != nil {
        //查詢有問題革娄,就提示文章不存在。
        this.Abort500(syserror.New("文章不存在冕碟!", err))
    }
    //將文章的信息以及key傳到頁面。
    this.Data["note"] = note
    this.Data["key"] = key
    //"note_new.html" 是文章新增的頁面匆浙,之前實現(xiàn)文章新增功能的時候
    this.TplName = "note_new.html"
}
3.2 修改文章保存的控制器邏輯安寺,讓頁面保存成功后跳轉(zhuǎn)頁面到文章詳情頁面。修改controllers->note.go中的Save方法首尼。
// @router /save/:key [post]
func (this *NoteController) Save() {
    ...
    //原代碼:this.JSONOkH("保存成功", H{})
    this.JSONOk("保存成功", fmt.Sprintf("/details/%s", key))
}

4. 前臺頁面調(diào)整

4.1 在文章詳情頁面中挑庶,我們將當前登陸的用戶信息言秸,文章的用戶所屬id,以及文章的key迎捺,保存到j(luò)s變量中举畸。修改views->details.html頁面添加如下代碼
<script>
var user = {{.User}};//這兒輸出直接就是json對象
//這兒將文章的信息拼成json對象賦值給note變量
var note = { userid:{{.note.UserID}},key:{{.note.Key}} };
</script>
4.2 在文章詳情頁面添加修改和刪除的操作按鈕,我們采用layui提供的fixbar控件凳枝,同時我們根據(jù)當前登陸的用戶和當前文章詳情頁的文章的所屬用戶來判斷是否顯示按鈕抄沮,修改views->details.html頁面添加如下代碼
<script>
...
 layui.use(['util','jquery'], function(){
        var util = layui.util,$= layui.jquery;
        //用戶必須登陸,
        //登陸的用戶的role必須為0岖瑰,可以修改文章
        //登陸的用戶的id叛买,必須等于當前文章詳情頁的文章所屬用戶的id
        if(user&& user.id >0&&user.role===0&&user.id ===note.userid){
            util.fixbar({
            bar1: '&#xe642;',//編輯的圖標
            bar2:'&#xe640;'  //刪除的圖標
            ,click: function(type){
                console.log(type);
                if(type === 'bar1'){
                    //跳轉(zhuǎn)到修改文章的頁面
                    window.location.href="/note/edit/"+note.key
                }
                if(type === 'bar2'){
                   //刪除的邏輯,等待實現(xiàn)蹋订。
                }
            }
        });
        }
    });
</script>
4.3 文章修改的頁面views-note_new.html頁面率挣,雖然之前實現(xiàn)了修改文章的功能。頁面模版沒有根據(jù)傳過來的文章內(nèi)容來填充文章的內(nèi)容露戒。我們修改views-note_new.html 修改代碼如下
...
 <form class="layui-form layui-form-pane" action="">
          ...
        <!--{{/* 修改代碼為: value="{{.note.Title}}" */}}-->
        <div class="layui-input-block">
            <input type="text" name="title" required=""
                    value="{{.note.Title}}"
                    lay-verify="required" placeholder="請輸入標題"
                    autocomplete="off" class="layui-input">
             ...
          <!--{{/* 修改代碼為: {{if .note}}{{str2html .note.Content}}{{end}} */}}-->
            <div id="edit"
                    style="background: #fff;">
                {{if .note}}{{str2html .note.Content}}{{end}}
            </div>
        </div>
    </div>
    ...
</form>

文章修改功能已經(jīng)實現(xiàn)


文章刪除

1. 功能分析

我們需要定義文章刪除功能的路由定義:/del/[文章的key] 為post請求椒功。我們要添加根據(jù)用戶id和文章的key去刪除文章的數(shù)據(jù)庫方法。再添加路由對應的控制器邏輯智什,調(diào)用刪除文章的數(shù)據(jù)庫方法來刪除文章蛾茉。修改文章詳情頁面,當點擊刪除按鈕的時候撩鹿,后臺發(fā)送post請求谦炬,成功提示刪除成功,頁面跳轉(zhuǎn)到首頁节沦。失敗就提示刪除失敗键思。

2. 數(shù)據(jù)庫邏輯調(diào)整

2.1 修改models-note.go文件,我們添加根據(jù)用戶id和文章的key甫贯,刪除文章的方法吼鳞,代碼如下
func DeleteNoteByUserIdAndKey(key string, userid int) error {
    return db.Delete(&Note{}, "key = ? and user_id = ?", key, userid).Error
}

3. 控制器邏輯調(diào)整

3.1 修改controllers-note.go文件,添加根據(jù)傳過來的key和當前登陸的用戶id 去調(diào)用刪除文章的控制器方法叫搁,代碼如下
// @router /del/:key [post]
func (this *NoteController) Del() {
    //獲取頁面?zhèn)鬟^來的key值
    key := this.Ctx.Input.Param(":key")
    //調(diào)用數(shù)據(jù)庫方法刪除文章
    if err := models.DeleteNoteByUserIdAndKey(key, int(this.User.ID)); err != nil {
        //刪除失敗赔桌,提示頁面刪除失敗
        this.Abort500(syserror.New("刪除失敗", err))
    }
    //返回刪除成功,并跳轉(zhuǎn)到首頁
    this.JSONOk("刪除成功", "/")
}

4. 前臺頁面調(diào)整

4.1 修改views->details.html文件,添加向后臺發(fā)送刪除文章的請求的邏輯渴逻,添加代碼如下
 layui.use(['util','jquery'], function(){
            ...
            if(type === 'bar2'){
                $.post("/note/del/"+note.key,function (data) {
                    if (data.code === 0) {
                        layer.msg("刪除成功");
                        if (data.action) {
                            setTimeout(function () {
                                window.location.href = data.action;
                            }, 300);
                        }
                    } else {
                        layer.msg("刪除失敿驳场:" + data.msg);
                    }
                }, "json").error(function () {
                    layer.msg("網(wǎng)絡(luò)異常")
                });
            }
            ...
});

文章刪除的功能已經(jīng)實現(xiàn)。
這兒可以考慮優(yōu)化一下刪除文章的時候提示是否刪除


貼個頁面效果圖

文章顯示效果圖

廣告:

  1. 本專集也做了視頻教程 : B站地址 惨奕,前期可能視頻和專集有的細微差別雪位,望大家諒解。歡迎大家關(guān)注梨撞。
  2. 最近做幾個視頻雹洗,歡迎大家觀賞香罐!這些視頻源碼:github倉庫
    B站001时肿、B站002庇茫、B站002B站004
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末螃成,一起剝皮案震驚了整個濱河市旦签,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锈颗,老刑警劉巖顷霹,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異击吱,居然都是意外死亡淋淀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門覆醇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朵纷,“玉大人,你說我怎么就攤上這事永脓∨鄞牵” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵常摧,是天一觀的道長搅吁。 經(jīng)常有香客問我,道長落午,這世上最難降的妖魔是什么谎懦? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮溃斋,結(jié)果婚禮上界拦,老公的妹妹穿的比我還像新娘。我一直安慰自己梗劫,他們只是感情好享甸,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梳侨,像睡著了一般蛉威。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猫妙,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天瓷翻,我揣著相機與錄音,去河邊找鬼割坠。 笑死齐帚,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的彼哼。 我是一名探鬼主播对妄,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼敢朱!你這毒婦竟也來了剪菱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拴签,失蹤者是張志新(化名)和其女友劉穎孝常,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚓哩,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡构灸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岸梨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喜颁。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖曹阔,靈堂內(nèi)的尸體忽然破棺而出半开,到底是詐尸還是另有隱情,我是刑警寧澤赃份,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布寂拆,位于F島的核電站,受9級特大地震影響抓韩,放射性物質(zhì)發(fā)生泄漏纠永。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一园蝠、第九天 我趴在偏房一處隱蔽的房頂上張望渺蒿。 院中可真熱鬧,春花似錦彪薛、人聲如沸茂装。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽少态。三九已至,卻和暖如春易遣,著一層夾襖步出監(jiān)牢的瞬間彼妻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侨歉,地道東北人屋摇。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像幽邓,于是被迫代替她去往敵國和親炮温。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 【小雞創(chuàng)作】beego開發(fā)輕博客 本章目標:添加“文章錄入”功能github: 打開后牵舵,點擊右上角star按鈕視頻...
    小雞創(chuàng)作閱讀 3,088評論 0 7
  • 1柒啤、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_x閱讀 15,968評論 3 119
  • 當阮青青挽著莊時毅的手進入酒會大堂的時候,驚艷了很多人的目光畸颅。一襲白色及膝蕾絲禮服担巩,一頭長發(fā)被簡單的扎成了半扎發(fā)發(fā)...
    許你流星閱讀 606評論 6 6
  • 參加這個訓練營大家一起畫,對于我這個懶人來說有一種約束力没炒。繼續(xù)努力(? ???ω??? ?)
    ___Z1995閱讀 235評論 1 1
  • 說到紅果子涛癌,你會想到什么?顏色喜人窥浪,口感酸甜祖很,伴著美好滋味而來的還有許多美好記憶吧~ 我記憶里的第一個紅果子是蘋果...
    段鍇閱讀 1,096評論 1 2