Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Golang melaksanakan proses semakan

Golang melaksanakan proses semakan

王林
王林asal
2023-05-12 21:51:36517semak imbas

Dengan perkembangan pesat Internet, keperluan untuk ketepatan dan keselamatan maklumat semakin tinggi dan lebih tinggi. Oleh itu, dalam kebanyakan tapak web dan sistem, adalah amat penting untuk melaksanakan proses semakan yang lengkap. Artikel ini akan memperkenalkan secara terperinci cara melaksanakan proses audit dengan cepat melalui bahasa Golang.

1. Apakah proses semakan?

Proses semakan biasanya terdiri daripada satu siri pemindahan status dan operasi penyemak adalah untuk memastikan ketepatan, kesempurnaan dan kesahihan maklumat. , termasuk tetapi tidak terhad kepada semakan pendaftaran, semakan artikel, semakan pesanan, dsb. Melaksanakan proses audit yang memenuhi keperluan perniagaan syarikat memainkan peranan yang sangat penting dalam memastikan operasi normal perniagaan dan integriti data.

2. Pengenalan kepada bahasa Golang

Golang ialah bahasa pengaturcaraan yang cekap, ditaip kuat dan sangat sesuai. Ia mempunyai mekanisme pengurusan memori yang sangat baik yang boleh memastikan kestabilan dan kecekapan program di bawah keadaan konkurensi yang tinggi. Berbanding dengan bahasa pengaturcaraan lain, Golang lebih sesuai untuk memproses konkurensi tinggi dan jumlah data yang besar. Selain itu, Golang mudah dipelajari, ringan, dan boleh digunakan di mana-mana platform.

3. Pelaksanaan proses semakan

Mari kita bincangkan cara melaksanakan proses semakan berdasarkan bahasa Golang.

1. Analisis keperluan

Sebelum melaksanakan proses semakan, kita perlu menjalankan analisis keperluan terlebih dahulu. Sebagai contoh, proses semakan artikel adalah seperti berikut:

  • Semakan belum selesai: Selepas artikel diserahkan, ia sedang menunggu untuk semakan.
  • Dalam semakan: Penyemak sedang menyemak artikel, tetapi semakan masih belum lulus.
  • Diluluskan: Penyemak berjaya menyemak dan menerbitkan artikel ke saluran rasmi.
  • Penolakan melalui semakan: Penyemak gagal membuat semakan dan pengarang asal dimaklumkan untuk mengubah suai atau enggan menerbitkan.

2. Reka bentuk pangkalan data

Seterusnya, anda perlu mereka bentuk pangkalan data untuk menyimpan maklumat audit. Kami perlu mereka bentuk jadual Artikel, termasuk medan berikut: ID, Tajuk, Kandungan, CreateTime, Status, AuditID, AuditTime. Antaranya, Status mewakili status artikel, AuditID mewakili ID penyemak dan AuditTime mewakili masa semakan.

3. Bina pelayan

Kami perlu membina pelayan HTTP untuk mengendalikan permintaan pelanggan. Kita boleh menggunakan pakej net/http yang disediakan oleh Golang untuk mencapai matlamat ini.

4. Reka bentuk penghalaan

Sebelum membina pelayan HTTP, kita perlu mereka bentuk penghalaan terlebih dahulu. Anda boleh menggunakan rangka kerja penghalaan pihak ketiga seperti gorila/mux untuk mengendalikan permintaan yang berbeza.

5. Pengesahan pengguna

Semasa proses semakan, kami perlu mengesahkan dan membenarkan pengguna. Ini boleh dicapai menggunakan rangka kerja pengesahan pihak ketiga seperti JWT.

6. Serahkan untuk semakan

Dalam proses semakan, artikel perlu menunggu untuk semakan selepas penyerahan. Kita boleh mewakili status artikel melalui medan Status dalam jadual Artikel.

7. Pemprosesan ulasan

Proses semakan memerlukan semakan oleh pengulas dan artikel boleh diterbitkan hanya selepas lulus semakan. Semasa proses audit, juruaudit perlu diperakui, diberi kuasa dan operasi lain, yang boleh dicapai melalui rangka kerja pengesahan pihak ketiga seperti JWT.

8. Pemberitahuan hasil semakan

Selepas semakan selesai, pengarang asal perlu dimaklumkan tentang hasil semakan. Pemberitahuan boleh dihantar melalui e-mel, SMS, WeChat, dll.

4. Kod contoh proses semakan

Seterusnya, kami akan mengambil proses semakan artikel sebagai contoh untuk menunjukkan cara melaksanakannya melalui bahasa Golang.

1. Reka bentuk penghalaan

Gunakan pakej gorila/mux untuk melaksanakan reka bentuk penghalaan:

router := mux.NewRouter()
router.HandleFunc("/article/add", AddArticle)
router.HandleFunc("/article/list", GetArticles)
router.HandleFunc("/audit/list", GetAuditList)
router.HandleFunc("/audit/pass", AuditPass)
router.HandleFunc("/audit/reject", AuditReject)

2. Pensijilan JWT:

//生成JWT Token
func createToken(user string) (string, error) {
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
        "user":user,
        "exp":time.Now().Add(time.Hour * 24).Unix(),
    })
    return token.SignedString([]byte("mysecret"))
}

//中间件JWT认证
func tokenMiddleware(handler http.HandlerFunc) http.HandlerFunc {
    return func(writer http.ResponseWriter, request *http.Request) {
        tokenString := request.Header.Get("Authorization")
        if tokenString == "" {
            http.Error(writer, "Token required", http.StatusUnauthorized)
            return
        }
        tokenString = strings.Replace(tokenString, "Bearer ", "", -1)
        token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
            return []byte("mysecret"), nil
        })
        if err != nil || !token.Valid {
            http.Error(writer, "Unauthorized", http.StatusUnauthorized)
            return
        }
        handler(writer, request)
    }
}

3. Pelaksanaan antara muka HTTP

// 添加文章
func AddArticle(writer http.ResponseWriter, request *http.Request) {
    title := request.FormValue("title")
    content := request.FormValue("content")
    if title == "" || content == "" {
        http.Error(writer, "Invalid params", http.StatusBadRequest)
        return
    }

    // 获取当前用户
    user, ok := request.Context().Value("user").(string)
    if !ok {
        http.Error(writer, "Unauthorized", http.StatusUnauthorized)
        return
    }

    // 添加文章
    status := "wait"
    err := db.Exec("INSERT INTO articles (title, content, status, create_time, author) VALUES (?, ?, ?, ?, ?)", title, content, status, time.Now().Unix(), user).Error
    if err != nil {
        http.Error(writer, err.Error(), http.StatusBadRequest)
        return
    }

    writer.Write([]byte("success"))
}

// 获取文章列表
func GetArticles(writer http.ResponseWriter, request *http.Request) {
    // 获取当前用户
    user, ok := request.Context().Value("user").(string)
    if !ok {
        http.Error(writer, "Unauthorized", http.StatusUnauthorized)
        return
    }

    // 获取文章列表
    var articles []Article
    err := db.Where("author = ?", user).Find(&articles).Error
    if err != nil {
        http.Error(writer, err.Error(), http.StatusBadRequest)
        return
    }

    // 返回文章列表
    writer.Header().Set("Content-Type", "application/json")
    json.NewEncoder(writer).Encode(articles)
}

// 获取审核列表
func GetAuditList(writer http.ResponseWriter, request *http.Request) {
    // 获取当前用户
    user, ok := request.Context().Value("user").(string)
    if !ok {
        http.Error(writer, "Unauthorized", http.StatusUnauthorized)
        return
    }

    // 查询审核列表
    var articles []Article
    err := db.Where("status = ?", "wait").Find(&articles).Error
    if err != nil {
        http.Error(writer, err.Error(), http.StatusBadRequest)
        return
    }

    // 返回审核列表
    writer.Header().Set("Content-Type", "application/json")
    json.NewEncoder(writer).Encode(articles)
}

// 审核通过
func AuditPass(writer http.ResponseWriter, request *http.Request) {
    id := request.FormValue("id")
    if id == "" {
        http.Error(writer, "Invalid params", http.StatusBadRequest)
        return
    }

    // 获取当前用户
    user, ok := request.Context().Value("user").(string)
    if !ok {
        http.Error(writer, "Unauthorized", http.StatusUnauthorized)
        return
    }

    // 审核文章
    status := "pass"
    err := db.Exec("UPDATE articles SET status = ?, audit_id = ?, audit_time = ? WHERE id = ?", status, user, time.Now().Unix(), id).Error
    if err != nil {
        http.Error(writer, err.Error(), http.StatusBadRequest)
        return
    }

    writer.Write([]byte("success"))
}

// 审核拒绝
func AuditReject(writer http.ResponseWriter, request *http.Request) {
    id := request.FormValue("id")
    if id == "" {
        http.Error(writer, "Invalid params", http.StatusBadRequest)
        return
    }

    // 获取当前用户
    user, ok := request.Context().Value("user").(string)
    if !ok {
        http.Error(writer, "Unauthorized", http.StatusUnauthorized)
        return
    }

    // 审核文章
    status := "reject"
    err := db.Exec("UPDATE articles SET status = ?, audit_id = ?, audit_time = ? WHERE id = ?", status, user, time.Now().Unix(), id).Error
    if err != nil {
        http.Error(writer, err.Error(), http.StatusBadRequest)
        return
    }

    writer.Write([]byte("success"))
}

5. Ringkasan

Artikel ini memperkenalkan cara melaksanakan proses semakan berdasarkan semakan artikel melalui bahasa Golang. Semasa melaksanakan proses semakan, kami juga mempelajari reka bentuk penghalaan, pengesahan JWT, pelaksanaan antara muka HTTP, dsb. Semoga artikel ini dapat membantu pembaca yang sedang membangunkan Golang.

Atas ialah kandungan terperinci Golang melaksanakan proses semakan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:kaedah panggilan dinamik golangArtikel seterusnya:kaedah panggilan dinamik golang