博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go基础学习记录 - 编写Web应用程序 - 博客编辑功能之Model的重新思考
阅读量:6004 次
发布时间:2019-06-20

本文共 4415 字,大约阅读时间需要 14 分钟。

每次我都会将自己实践的代码放到github上并且都会打一个tag,方便后面用的同学使用,这里我以下面分支的代码进行实践分享

https://github.com/durban89/typescript_demo.gittag: 1.1.2

上篇文章【】,在修改的过程中,遇到了一个问题就是Update函数与sqlite中的函数有冲突的提示,提示内容大概意思是重新定义了这个函数,这次我将更新的逻辑进行了更改,重新定义了下Model,同时将QueryOne函数也进行了更新。

第一步、重新定义Model

重新定义Model,主要是从概念上抽象了一些逻辑,比如一个查询语句最基本的where、select和更新中的update部分,我将这一部分作为一个小块来处理,处理代码逻辑如下,首先建立一个models/models.go文件,内容如下

package modelsimport (    "fmt"    "strings")// Model 模型type Model interface {    QueryOne()    Update()}// WhereCondition where条件type WhereCondition struct {    Operator string    Value    string}// WhereValues where条件值type WhereValues map[string]WhereCondition// UpdateValues update条件值type UpdateValues map[string]string// SelectValues select条件值type SelectValues []string// MergeWhere 合并where条件func (w WhereValues) MergeWhere() string {    where := []string{}    for k, v := range w {        if v.Operator == "" {            s := fmt.Sprintf("%s = %s", k, v.Value)            where = append(where, s)        } else {            s := fmt.Sprintf("%s %s %s", k, v.Operator, v.Value)            where = append(where, s)        }    }    return strings.Join(where, " AND ")}// MergeUpdate 合并update条件func (u UpdateValues) MergeUpdate() string {    update := []string{}    for k, v := range u {        s := fmt.Sprintf("%s = '%s'", k, v)        update = append(update, s)    }    return strings.Join(update, ", ")}// MergeSelect  合并select条件func (s SelectValues) MergeSelect() string {    return strings.Join(s, ", ")}

这样我觉得稍微清晰了一些,而且放在一个models.go文件,代表几乎所有的model都应该有这些方法。

修改完方法,就需要修改controller

第二步、修改Model

这里主要是先修改下models/blog.go,分别修改了QueryOne和Update两个函数,修改后的代码如下

// QueryOne 获取一条数据func (b *Blog) QueryOne(where WhereValues) (helpers.Page, error) {    var selectString = SelectValues{        "*",    }.MergeSelect()    var whereString = where.MergeWhere()    sql := fmt.Sprintf("SELECT %s FROM %s WHERE %s LIMIT 0, 1", selectString, tableName, whereString)    rows, err := Conn.Query(sql)    var res = helpers.Page{}    if err != nil {        return res, err    }    for rows.Next() {        var autokid int        var title string        err = rows.Scan(&autokid, &title)        if err != nil {            return res, err        }        p := helpers.Page{            ID:    autokid,            Title: title,        }        res = p    }    if res.ID == 0 {        return res, errors.New("文章不存在")    }    return res, nil}

另外Update函数内容如下

// Update 更新数据func (b *Blog) Update(update UpdateValues, where WhereValues) (int64, error) {    var updateString = update.MergeUpdate()    var whereString = where.MergeWhere()    sql := fmt.Sprintf("UPDATE %s SET %s WHERE %s", tableName, updateString, whereString)    stmt, err := Conn.Prepare(sql)    if err != nil {        return 0, err    }    res, err := stmt.Exec()    if err != nil {        return 0, err    }    affect, err := res.RowsAffected()    if err != nil {        return 0, err    }    return affect, nil}

这里的话暂时没有写单元测试

第三步、修改Controller

controller的修改主要是修改article中ArticleEdit函数,内容如下

// ArticleEdit 编辑文章func ArticleEdit(w http.ResponseWriter, r *http.Request) {    id := r.URL.Query().Get("id")    if id == "" {        http.NotFound(w, r)        return    }    where := models.WhereValues{        "autokid": models.WhereCondition{            Operator: "=",            Value:    id,        },    }    update := map[string]string{}    if strings.ToLower(r.Method) == "get" {        blogModel := &models.Blog{}        p, err := blogModel.QueryOne(where)        if err != nil {            http.NotFound(w, r)            return        }        crutime := time.Now().Unix()        h := md5.New()        io.WriteString(h, strconv.FormatInt(crutime, 10))        token := fmt.Sprintf("%x", h.Sum(nil))        p.Token = token        helpers.RenderTemplate(w, "edit", &p)    } else if strings.ToLower(r.Method) == "post" {        title := r.FormValue("title")        if title == "" {            http.Redirect(w, r, fmt.Sprintf("/edit?id=%s", id), http.StatusFound)            return        }        update["title"] = title        blogModel := &models.Blog{}        _, err := blogModel.Update(update, where)        if err != nil {            http.NotFound(w, r)            return        }        http.Redirect(w, r, fmt.Sprintf("/edit?id=%s", id), http.StatusFound)        return    }}

经过前面的修改,自我觉得更加golang编程化了。

重新编辑代码并运行,一切正常,想要查看完整代码的,可以到下面引导去下载

项目更新地址

https://github.com/durban89/typescript_demo.gittag: 1.1.3

转载地址:http://inpmx.baihongyu.com/

你可能感兴趣的文章
Html5 移动端 触摸滑动事件
查看>>
ASP.NET Core 2 学习笔记(八)URL重写
查看>>
vs2015 cordova环境安装【个人遇到的几个问题】
查看>>
数据结构------线段树1:概述与建树
查看>>
使用path制作各类型动画路径
查看>>
Linux yum出现GPG密钥不匹配
查看>>
AssetBundle使用模式
查看>>
apache cxf
查看>>
javascript语言精髓与编程实践摘要
查看>>
Red Hat 第四季度总营收为8.79亿美元,低于预期
查看>>
Node.js 事件循环
查看>>
用CSS绘制三角形
查看>>
区块链开发公司浅析未来区块链的发展趋势
查看>>
mysql5.7密码策略及修改技巧
查看>>
KDevelop 5.3.2 发布,跨平台 IDE
查看>>
JAVA中的设计模式一(单例模式)
查看>>
WEBGL学习【十】运动模型
查看>>
《癌症·真相》读书简摘
查看>>
社交网络分析(Social Network Analysis in Python)①
查看>>
JS数据结构与算法-栈
查看>>