Webサービスとクライアントは、実用的な要約を開発します

序文

このプロジェクトは、科学の中山大学とコンピュータのデータ2019サービス・コンピューティングの作品です。すべてのコードは、ブログgithubのそれらにアップロードされます。
githubのプロジェクト住所:https://github.com/BlogByFourMan
プロフィール:https://starashzero.github.io

アウトライン

ウェブブログアプリケーションの個別の前端と後端を完了するために4つの私たちのグループは、ブログ--simple
現在サポートされている機能は次のとおりです。

  • 登録
  • 着陸
  • ビューのブログ
  • コメントを表示
  • 注釈

作品の説明

私は、グループ内のバックエンドユーザーに関連するAPIのコードを記述するための責任がありました

  • プロジェクト構造:
    ここに画像を挿入説明
  • 関連するコード格納されたデータベース、BoltDBを使用するデータベースをパッケージDB
  • パケット構造を格納するために使用されるモデルデータ
  • ゴーパッケージ実装コードAPI

開発プロセス

  • デシベルは、
    メソッドのキーを使用して、データベースコード、データベースの使用BoltDBを達成DB:値
    Iは、ユーザー関連のデータベースのコードで実現しました

    • GETUSER
      GETUSERは、ユーザ名の入力パラメータは、ユーザ情報の出力のユーザ情報のクエリを実行する
      クエリが失敗したとして、デフォルトのユーザ名とパスワードによっては「」ユーザーのIDです
      func GetUser(username string) model.User {
          db, err := bolt.Open(GetDBPATH(), 0600, nil)
          if err != nil {
              log.Fatal(err)
          }
          defer db.Close()
      
          user := model.User{
              Username: "",
              Password: "",
          }
      
          err = db.View(func(tx *bolt.Tx) error {
              b := tx.Bucket([]byte("user"))
              if b != nil {
                  data := b.Get([]byte(username))
                  if data != nil {
                      err := json.Unmarshal(data, &user)
                      if err != nil {
                          log.Fatal(err)
                      }
                  }
              }
              return nil
          })
          if err != nil {
              log.Fatal(err)
          }
      
          return user
      }
      
    • PutUsersの
      PutUsersは、(複数のサポートを追加する)、ユーザデータが追加された入力パラメータユーザーの配列を実現し、エラーメッセージを返します
      func PutUsers(users []model.User) error {
          db, err := bolt.Open(GetDBPATH(), 0600, nil)
          if err != nil {
              log.Fatal(err)
          }
          defer db.Close()
      
          err = db.Update(func(tx *bolt.Tx) error {
              b := tx.Bucket([]byte("user"))
              if b != nil {
                  for i := 0; i < len(users); i++ {
                      username := users[i].Username
                      data, _ := json.Marshal(users[i])
                      b.Put([]byte(username), data)
                  }
              }
              return nil
          })
      
          if err != nil {
              return err
          }
          return nil
      }
      
  • モデル
    のいくつかのデータ構造を使用するために開発プロセスを必要としています

    • ユーザーは、
      ユーザーは、比較的単純な、唯一の保存ユーザー名とパスワード、ユーザー情報を格納するためのデータ構造であり、
      type User struct {
          Username string `json:"username,omitempty"`
      
          Password string `json:"password,omitempty"`
      }        
      
    • コメント
      、ユーザーのコメント、文書番号、コメント情報、コメント、および他のコンテンツを含むCommentクラスのストレージ・コメント情報、
      type Comment struct {
          User string `json:"user,omitempty"`
      
          ArticleId int64 `json:"article_id,omitempty"`
      
          Date string `json:"date,omitempty"`
      
          Content string `json:"content,omitempty"`
      }
      
  • ゴー
    ゴーパッケージ実装APIコード

    • response.go
      単一レスポンス用response.go
      myResponse構造は、応答情報を格納するために使用される
      オプションOPTIONS(ローケン認証に必要な、予めオプションでパケットを受信する)別々に処理された
      応答メッセージを送信することに応答

      type MyResponse struct {
          OkMessage    interface{} `json:"ok,omitempty"`
          ErrorMessage interface{} `json:"error,omitempty"`
      }
      
      func Options(w http.ResponseWriter, r *http.Request){
          w.Header().Set("Content-Type", "application/json; charset=UTF-8")
          w.Header().Set("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS")
          w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Credentials, Access-Control-Allow-Methods, Access-Control-Allow-Headers, Authorization, X-Requested-With")
          w.Header().Set("Access-Control-Allow-Origin", "*")
          w.WriteHeader(http.StatusOK)
      }
      
      func Response(response interface{}, w http.ResponseWriter, code int) {
          jsonData, jErr := json.Marshal(&response)
      
          if jErr != nil {
              log.Fatal(jErr.Error())
          }
      
          w.Header().Set("Content-Type", "application/json; charset=UTF-8")
          w.Header().Set("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS")
          w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Credentials, Access-Control-Allow-Methods, Access-Control-Allow-Headers, Authorization, X-Requested-With")
          w.Header().Set("Access-Control-Allow-Origin", "*")
          w.Write(jsonData)
          w.WriteHeader(code)
      }
      
    • api_user.go
      api_user.goユーザー関連のAPIを実装します。

      • POST /物品/ {ID} /コメント
      • POST /ユーザー/ログイン
      • POST /ユーザー/レジスタ

      私は、これらの3つの領域の開発を担当していますが、ローケン認証は、他の乗組員によって完成されます

      • ログインと登録
        ずっと同じログインおよびレジスタを達成するために
        • 最初のパラメータを読み込みボディは、ユーザーの構造に変換します
          err := json.NewDecoder(r.Body).Decode(&user)
          
        • データベースから取得したユーザ情報に対応するユーザ名
          check := db.GetUser(user.Username)
          
        • こうしたそこにユーザー認証で、アカウントとパスワードに対応するようにしているかどうかなど、ユーザの認証情報、
        • 最後に、トークンを返します
          Response(MyResponse{
              tokenString,
              nil,
          }, w, http.StatusOK)
          
        • CommentPost
          次のようにユーザーを認証するために、コメントニーズを追加し、メインプロセスは以下のとおりです。
          • ユーザートークンていることを確認します

            token, isValid := ValidateToken(w, r)
            
          • 身体パラメータを読み込み、および構造のコメントをデコード

            err := json.NewDecoder(r.Body).Decode(&comment)
            
          • トークン更新ユーザーのよります

            if v, ok := token.Claims.(jwt.MapClaims); ok {
                name, _ := v["name"].(string)
                comment.User = name
            }
            
          • 記事のID

            articleId := strings.Split(r.URL.Path, "/")[2]
            comment.ArticleId, err = strconv.ParseInt(articleId, 10, 64)
            
          • 生成時間

            comment.Date = fmt.Sprintf("%d-%d-%d", time.Now().Year(), time.Now().Month(), time.Now().Day())
            
          • データベースに追加されたコメント

            for i := 0; i < len(articles); i++ {
                articles[i].Comments = append(articles[i].Comments, comment)
            }
            
            err = db.PutArticles(articles)
            
          • コメントデータを返します。

            Response(MyResponse{
                comment,
                nil,
            }, w, http.StatusOK)
            
公開された34元の記事 ウォンの賞賛8 ビュー2745

おすすめ

転載: blog.csdn.net/qq_20549085/article/details/103454127