序文
このプロジェクトは、科学の中山大学とコンピュータのデータ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 }
- GETUSER
-
モデル
のいくつかのデータ構造を使用するために開発プロセスを必要としています- ユーザーは、
ユーザーは、比較的単純な、唯一の保存ユーザー名とパスワード、ユーザー情報を格納するためのデータ構造であり、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)
-
- 最初のパラメータを読み込みボディは、ユーザーの構造に変換します
-